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

标签 python linux file buffer rhel6

documentation声明缓冲的默认值为:如果省略,则使用系统默认值。我目前使用的是 Red Hat Linux 6,但我无法确定为系统设置的默认缓冲。

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

最佳答案

由于您链接到 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 ,它解释说,如果你从不调用任何缓冲函数:

Normally all files are block buffered. When the first I/O operation occurs on a file, malloc(3) is called, and a buffer is obtained.

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

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

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


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

关于python - Linux 上文件的默认缓冲区大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18194374/

相关文章:

c - 如何从C语言的文本文件中读取某些数据

python - 如何将 picamera 视频帧转换为 openCV 对象

python - 如何在osmnx图中创建颜色栏

python - 使用 Python 将字符串列合并到一组列表

linux - 在 Windows 上的 Ubuntu 上从 Bash 打开 Sublime Text

linux - command_not_found_handler 不带斜杠

windows - 为什么这个批处理文件会产生额外的、意外的、不需要的字符?

python - 如何检查 django 模板中的 TEMPLATE_DEBUG 标志?

linux - 在 IPython 中安装 lisp 内核

c - 从C中的文件读取数据开头的大数字