Размер буфера по умолчанию для файла в Linux

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

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

3 Solutions collect form web for “Размер буфера по умолчанию для файла в Linux”

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

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

Если вы читаете man- setvbuf glibc setvbuf , она объясняет, что если вы никогда не вызываете какие-либо функции буферизации:

Обычно все файлы блокируются буфером. Когда первая операция ввода-вывода происходит в файле, вызывается 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 МБ на каком-то скрипте с буферизованным I / O-привязкой и посмотрите, каковы различия в производительности.)

Я не уверен, что это правильный ответ, но библиотека python 3.0 и библиотека python 20 описывают 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 
 #include <stdio.h> int main(int argc, char* argv[]){ printf("%d\n", BUFSIZ); return 0; } 

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

Python - лучший язык программирования в мире.