Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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


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

Ответ 2

Я не уверен, что это правильный ответ, но библиотека 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

Ответ 3

#include <stdio.h>

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

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