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

该文档指出,缓冲的默认值是: If omitted, the system default is used 。 我目前在Red Hat Linux 6上,但是我无法弄清楚为系统设置的默认缓冲。

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

Solutions Collecting From Web of "Linux上文件的默认缓冲区大小"

既然你链接到2.7文档,我假设你使用2.7。 (在Python 3.x中,这一切都变得更简单了,因为在Python级别上暴露了更多的缓冲区。)

实际上,所有open (在POSIX系统上)调用fopen ,然后,如果你已经通过了任何bufferingsetvbuf 。 由于你没有传递任何东西,所以你最终只能使用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的显式缓冲区大小,并查看性能差异。)

我不确定这是正确的答案,但是Python 3.0库和Python 20库都以与open()文档中描述的默认相同的方式描述io.DEFAULT_BUFFER_SIZE 。 巧合?

如果不是,那么我的答案是:

 $ 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; } 

我做了“男人setvbuf”来找到这个。 setvbuf是文档页面的脚注[2]。