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

时间:2013-08-12 18:44:43

标签: python linux file buffer rhel6

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

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

3 个答案:

答案 0 :(得分:26)

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

所有open实际上(在POSIX系统上)都是fopen来电,然后,如果你已经传递了bufferingsetvbuf的任何内容。由于您没有传递任何内容,因此您最终会得到fopen的默认缓冲区,这是由您的C标准库决定的。 (有关详细信息,请参阅the source。如果没有buffering,则会将-1传递给PyFile_SetBufSize,除非bufsize >= 0,否则不会执行任何操作。)

如果您阅读glibc setvbuf manpage,它会解释如果您从未调用任何缓冲功能:

  

通常所有文件都是块缓冲的。当对文件进行第一次I / O操作时,将调用malloc(3),并获取缓冲区。

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

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

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


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

答案 1 :(得分:13)

我不确定这是正确的答案,但python 3.0 librarypython 20 library都以与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

答案 2 :(得分:-1)

#include <stdio.h>

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

我做了'man setvbuf'找到这个。 setvbuf是文档页面的脚注[2]。