Размер буфера по умолчанию для файла в Linux
на документация утверждает, что значение по умолчанию для буферизации-это: If omitted, the system default is used
. В настоящее время я нахожусь в Red Hat Linux 6, но я не могу выяснить буферизацию по умолчанию, которая установлена для системы.
может ли кто-нибудь указать мне, как определить буферизацию для системы?
3 ответов
поскольку вы связаны с 2.7 docs, я предполагаю, что вы используете 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 объединяет c++ streambuf и C stdio buffering), но в конечном счете, он выделяет buf _IO_BUFSIZE
, который является псевдонимом для платформы макрос _G_BUFSIZE
, которая составляет 8192
.
конечно, вы, вероятно, хотите отслеживать макросы в своей собственной системе, а не доверять общему источнику.
вы можете задаться вопросом, почему нет хорошего документированного способа получить эту информацию. Вероятно, это потому, что тебе все равно. Если вам нужен определенный размер буфера, вы устанавливаете один вручную; если вы верите, что система знает лучше, просто доверяйте ей. Если вы на самом деле не работаете над ядром или libc, какая разница? Теоретически это также оставляет открытой возможность того, что система может сделать что-то умное здесь, например, выбрать bufsize на основе размера блока для файловой системы файла или даже на основе данных статистики, хотя это не похоже на linux/glibc, FreeBSD или OS X делать что-либо, кроме использования константы. И скорее всего это потому, что это действительно не имеет значения для большинства приложений. (Возможно, вы захотите проверить это самостоятельно-используйте явные размеры буфера от 1KB до 2MB на некотором буферизованном скрипте с привязкой к вводу-выводу и посмотрите, каковы различия в производительности.)
Я не уверен, что это правильный ответ, но библиотека 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]на странице документации.