Linux上文件的默认缓冲区大小

nam*_*ked 18 python linux buffer file rhel6

文件规定,对于缓冲的默认值是: If omitted, the system default is used.我目前在Red Hat Linux 6上,但我无法弄清楚为系统设置的默认缓冲.

任何人都可以指导我如何确定系统的缓冲?

aba*_*ert 27

由于您链接到2.7文档,我假设您使用的是2.7.(在Python 3.x中,这一切都变得更加简单,因为在Python级别暴露了更多的缓冲.)

所有open实际上(在POSIX系统上)都是调用fopen,然后,如果你已经传递了任何东西buffering,setvbuf.由于你没有传递任何东西,你最终会得到默认的缓冲区fopen,这取决于你的C标准库.(有关详细信息,请参阅源代码.如果没有buffering,则将-1传递给PyFile_SetBufSize,除非执行任何操作bufsize >= 0.)

如果您阅读了glibc setvbuf联机帮助页,它会解释如果您从未调用过任何缓冲函数:

通常所有文件都是块缓冲的.当在文件上发生第一次I/O操作时,malloc调用(3),并获得缓冲区.

请注意,它没有说明获得了什么大小的缓冲区.这是故意的; 这意味着实现可以是智能的,并为不同的情况选择不同的缓冲区大小.(有一个BUFSIZ常数,但只有当你调用遗留函数时才会使用setbuf它;它不能保证在任何其他情况下使用.)

那么,发生什么?好吧,如果你看看glibc源代码,最终会调用宏_IO_DOALLOCATE,它可以被挂钩(或被覆盖,因为glibc统一了C++ streambuf和C stdio缓冲),但最终,它分配了一个buf _IO_BUFSIZE,这是一个别名特定于平台的宏_G_BUFSIZE,即8192.

当然,您可能希望在自己的系统上追踪宏而不是信任通用源.


您可能想知道为什么没有良好的文档记录方式来获取此信息.大概是因为你不应该关心.如果您需要特定的缓冲区大小,请手动设置一个; 如果您相信系统最了解,那就相信它吧.除非你真的在内核或libc上工作,否则谁在乎呢?理论上,这也留下了系统在这里可以做一些聪明的事情的可能性,比如根据文件的文件系统的块大小选择bufsize,甚至基于运行的stats数据,尽管它看起来不像linux/glibc ,FreeBSD或OS X做除了使用常量之外的任何事情.而且很可能是因为它对大多数应用程序来说无关紧要.(您可能希望自己测试一下 - 在一些缓冲的I/O绑定脚本上使用范围从1KB到2MB的显式缓冲区大小,并查看性能差异.)


小智 16

我不确定这是正确的答案,但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
Run Code Online (Sandbox Code Playgroud)