该文档指出缓冲的默认值为: If omitted, the system default is used
. 我目前使用的是 Red Hat Linux 6,但我无法确定为系统设置的默认缓冲。
谁能指导我如何确定系统的缓冲?
由于您链接到 2.7 文档,我假设您使用的是 2.7。(在 Python 3.x 中,这一切都变得简单多了,因为更多的缓冲暴露在 Python 级别。)
open
实际上(在 POSIX 系统上)所做的就是 call ,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,甚至基于运行的统计数据,尽管它看起来不像 linux/glibc 、FreeBSD 或 OS X 做任何事情,而不是使用常量。这很可能是因为它对大多数应用程序来说真的无关紧要。
我不确定这是不是正确的答案,但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]。