2013-08-12 7 views
15

Die documentation gibt an, dass der Standardwert für die Pufferung lautet: If omitted, the system default is used. Ich bin derzeit auf Red Hat Linux 6, aber ich bin nicht in der Lage, die Standardpufferung zu ermitteln, die für das System festgelegt ist.Standardpuffergröße für eine Datei unter Linux

Kann mir bitte jemand sagen, wie die Pufferung für ein System zu bestimmen?

Antwort

24

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.)

+0

Tolle Erklärung abarnert! Vielen Dank. – falconepl

-1
#include <stdio.h> 

int main(int argc, char* argv[]){ 
    printf("%d\n", BUFSIZ); 
    return 0; 
} 

Ich habe 'Mann Setvbuf', um dies zu finden. setvbuf ist Fußnote [2] der Dokumentationsseite.

+0

Nein, das ist nicht garantiert die Standardpuffergröße sein; es ist nur die Puffergröße für Legacy-Funktionen wie 'setbuf'. – abarnert

+0

Wenn das der Fall ist, ist das Argument nicht sehr hilfreich: [2] \t Das Angeben einer Puffergröße hat derzeit keinen Effekt auf Systemen, die Setvbuf() nicht haben. Die Schnittstelle zum Angeben der Puffergröße wird nicht mit einer Methode ausgeführt, die setvbuf() aufruft, da diese den Kern ablegen kann, wenn sie nach der Ausführung von I/O-Operationen aufgerufen wird, und es gibt keine zuverlässige Möglichkeit, festzustellen, ob dies der Fall ist. – seanmcl

+0

Welches Argument? Und welches System hast du, wo 'setvbuf (3)' Fußnoten hat? Drittens, [CPython 2.7 nennt sehr deutlich 'setbuf'] (http://hg.python.org/cpython/file/2.7/Objects/fileobject.c#l509), wenn' setvbuf' nicht verfügbar ist, also stimmt das nicht Es hat keine Wirkung. (Es stimmt, dass jeder positive Wert den gleichen Effekt hat wie jeder andere positive Wert auf 'setbuf'-only-Systemen, aber das ist definitiv definitiv kein _now_ Effekt.) Und schließlich ruft er' setvbuf' eindeutig auf, wenn _is_ verfügbar ist, also dein Argument, dass es nicht tun kann, ist strittig. – abarnert

11

Ich bin nicht sicher, ob es die richtige Antwort ist, aber python 3.0 library und python 20 library beide io.DEFAULT_BUFFER_SIZE in der gleichen Art und Weise beschreibt, dass der Standard für open() in der Dokumentation beschrieben. Zufall?

Wenn nicht, dann ist die Antwort für mich war:

$ python 
>>> import io 
>>> io.DEFAULT_BUFFER_SIZE 
8192 

$ lsb_release -a 
No LSB modules are available. 
Distributor ID: Ubuntu 
Description: Ubuntu 14.04.1 LTS 
Release:  14.04 
Codename:  trusty