21

文档指出缓冲的默认值为: If omitted, the system default is used. 我目前使用的是 Red Hat Linux 6,但我无法确定为系统设置的默认缓冲。

谁能指导我如何确定系统的缓冲?

4

3 回答 3

30

由于您链接到 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 做任何事情,而不是使用常量。这很可能是因为它对大多数应用程序来说真的无关紧要。

于 2013-08-12T19:12:35.803 回答
23

我不确定这是不是正确的答案,但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
于 2014-10-24T04:45:58.313 回答
-2
#include <stdio.h>

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

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

于 2013-08-12T19:04:47.847 回答