Seit Sie mit den 2.7-Dokumenten verknüpft haben, nehme ich an, dass Sie 2.7 verwenden. (In Python 3.x wird dies alles viel einfacher, weil viel mehr Pufferung auf der Python-Ebene verfügbar ist.)
Alle open
tatsächlich (auf POSIX-Systemen) ist Aufruf , und dann, wenn Sie haben alles für buffering
, setvbuf
übergeben. Da Sie nichts übergeben, haben Sie nur den Standardpuffer von , der Ihrer C-Standardbibliothek entspricht. (.. Siehe the source Einzelheiten Ohne buffering
, es geht -1 bis PyFile_SetBufSize
, die nichts, es sei denn bufsize >= 0
der Fall ist)
Wenn Sie die glibc setvbuf
manpage lesen, erklärt er, dass, wenn Sie noch nie eine der Puffer Funktionen aufrufen:
Normalerweise sind alle Dateien blockweise gepuffert. Wenn die erste E/A-Operation für eine Datei auftritt, wird malloc
(3) aufgerufen, und ein Puffer wird abgerufen.
Beachten Sie, dass es nicht sagt, welche Größe Puffer erhalten wird. Dies ist beabsichtigt; Das bedeutet, dass die Implementierung intelligent sein und unterschiedliche Puffergrößen für verschiedene Fälle auswählen kann. (Es gibt eine BUFSIZ
konstant, aber das wird nur verwendet, wenn Sie Legacy-Funktionen wie setbuf
nennen,. Es ist garantiert nicht in jedem anderen Fall verwendet werden)
Also, was ist passieren? Nun, wenn man sich die glibc-Quelle anschaut, ruft sie letztendlich das Makro _IO_DOALLOCATE
auf, das gehakt (oder überschrieben, weil glibc C++ streambuf und C stdio buffering vereinheitlichen kann), aber letztlich weist es einen Buf von _IO_BUFSIZE
zu, was ein Alias ist für das plattformspezifische Makro _G_BUFSIZE
, das ist 8192
.
Natürlich möchten Sie wahrscheinlich die Makros auf Ihrem eigenen System aufspüren, anstatt der generischen Quelle zu vertrauen.
Sie fragen sich vielleicht, warum es keine gute dokumentierte Möglichkeit gibt, diese Informationen zu erhalten. Vermutlich liegt es daran, dass Sie sich nicht darum kümmern sollten. Wenn Sie eine bestimmte Puffergröße benötigen, legen Sie eine manuell fest. Wenn Sie darauf vertrauen, dass das System es am besten kennt, vertrauen Sie ihm. Es sei denn, Sie arbeiten tatsächlich an dem Kernel oder der libc, wen interessiert das? Theoretisch lässt dies auch die Möglichkeit offen, dass das System hier etwas intelligentes tun könnte, wie zum Beispiel das Auswählen einer Bufsize basierend auf der Blockgröße für das Dateisystem der Datei oder sogar basierend auf laufenden Statistikdaten, obwohl es nicht wie linux/glibc aussieht , FreeBSD oder OS X tun alles andere als eine Konstante zu verwenden. Und das liegt wahrscheinlich daran, dass es für die meisten Anwendungen nicht wirklich wichtig ist. (Vielleicht möchten Sie das selbst testen - verwenden Sie explizite Puffergrößen von 1 KB bis 2 MB für ein gepuffertes E/A-gebundenes Skript und sehen Sie, was die Leistungsunterschiede sind.)
Tolle Erklärung abarnert! Vielen Dank. – falconepl