2013-08-12 6 views
15

В указано, что значением по умолчанию для буферизации является: If omitted, the system default is used. В настоящее время я на Red Hat Linux 6, но я не могу определить буферизацию по умолчанию, установленную для системы.Размер буфера по умолчанию для файла в Linux

Может ли кто-нибудь указать мне, как определить буферизацию для системы?

ответ

24

Поскольку вы связаны с документами 2.7, я предполагаю, что вы используете 2.7. (В Python 3.x, это все становится намного проще, потому что намного больше буферизации подвергаются на уровне Python.)

Всех open фактически делает (в системах POSIX) является вызовом fopen, а затем, если вы передали что-либо за buffering, setvbuf. Поскольку вы ничего не пропускаете, вы просто получаете буфер по умолчанию от fopen, который соответствует вашей стандартной библиотеке C. (. См. the source для деталей При отсутствии buffering, она проходит -1 до PyFile_SetBufSize, который ничего не делает, если bufsize >= 0)

Если вы читали glibc setvbuf manpage, он объясняет, что если вы никогда не вызвать любого из функций буферных:

Обычно все файлы блокируются блоком. Когда первая операция ввода-вывода происходит в файле, вызывается malloc (3) и получается буфер.

Обратите внимание, что он не говорит, какой размер буфера получен. Это намеренно; это означает, что реализация может быть умной и выбирать разные размеры буфера для разных случаев. (Существует постоянная BUFSIZ, но используется только при вызове устаревших функций, таких как setbuf;. Это не гарантировано быть использован в любом другом случае)

Итак, что это происходит? Ну, если вы посмотрите на источник glibc, в конечном счете он вызывает макрос _IO_DOALLOCATE, который можно подключить (или переопределить, поскольку glibc унифицирует буферизацию C++ streambuf и C stdio), но в конечном итоге он выделяет buf _IO_BUFSIZE, который является псевдонимом для специфичного для платформы макроса _G_BUFSIZE, который является 8192.

Конечно, вы, вероятно, захотите проследить макросы в своей собственной системе, а не доверять родовому источнику.


Вы можете задаться вопросом, почему нет хорошего документального способа получения этой информации. По-видимому, это потому, что вы не должны заботиться. Если вам нужен определенный размер буфера, вы устанавливаете его вручную; если вы верите, что система знает лучше, просто доверяйте ей. Если вы на самом деле не работаете над ядром или libc, кого это волнует? Теоретически это также оставляет открытой возможность того, что система может сделать что-то умное здесь, например, выбор bufsize на основе размера блока файловой системы файла или даже на основе данных о текущих файлах, хотя это не похоже на linux/glibc , FreeBSD или OS X - ничего, кроме использования константы. И, скорее всего, это потому, что это действительно не важно для большинства приложений. (Возможно, вы захотите проверить это самостоятельно - используйте явные размеры буферов от 1 КБ до 2 МБ на каком-то сценарии с буферизованным вводом-выводом и посмотрите, каковы различия в производительности.)

+0

Отличное объяснение abarnert! Благодарю. – falconepl

-1
#include <stdio.h> 

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

Я сделал «man setvbuf», чтобы найти это. setvbuf - сноска [2] на странице документации.

+0

Нет, это не гарантирует размер буфера по умолчанию; это только размер буфера, используемый для устаревших функций, таких как 'setbuf'. – abarnert

+0

Если это так, то аргумент не очень полезен: [2] \t Задание размера буфера в настоящее время не влияет на системы, у которых нет setvbuf(). Интерфейс для указания размера буфера не выполняется с помощью метода, который вызывает setvbuf(), поскольку он может выгружать ядро ​​при вызове после выполнения любого ввода-вывода, и нет надежного способа определить, действительно ли это так. – seanmcl

+0

Какой аргумент? И в какой системе вы находитесь, где 'setvbuf (3)' имеет сноски? В-третьих, [CPython 2.7 очень четко называет 'setbuf'] (http://hg.python.org/cpython/file/2.7/Objects/fileobject.c#l509), если' setvbuf' недоступен, поэтому неверно, что это не имеет никакого эффекта. (Это правда, что любое положительное значение имеет тот же эффект, что и любое другое положительное значение в системах с «setbuf», но это все равно определенно не эффект _no_.) И, наконец, он явно называет 'setvbuf', если _is_ доступен, поэтому ваш аргумент, что он не может этого сделать, является спорным. – abarnert

11

Я не уверен, что это правильный ответ, но python 3.0 library и python 20 library оба описывают io.DEFAULT_BUFFER_SIZE таким же образом, что по умолчанию описывается в документации для open(). Совпадение?

Если нет, то ответ для меня:

$ 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 

 Смежные вопросы

  • Нет связанных вопросов^_^