documentation表示缓冲的默认值为:If omitted, the system default is used
。我目前在Red Hat Linux 6上,但我无法弄清楚为系统设置的默认缓冲。
有人可以指导我如何确定系统的缓冲吗?
答案 0 :(得分:26)
由于您链接到2.7文档,我假设您使用的是2.7。 (在Python 3.x中,这一切都变得更加简单,因为在Python级别暴露了更多的缓冲。)
所有open
实际上(在POSIX系统上)都是fopen
来电,然后,如果你已经传递了buffering
,setvbuf
的任何内容。由于您没有传递任何内容,因此您最终会得到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 library和python 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]。