繁体   English   中英

python内置的open()function缓冲有什么用?

[英]What is the use of buffering in python's built-in open() function?

Python 文档: https://docs.python.org/2/library/functions.html#open

open(name[, mode[, buffering]])  

上面的文档说“可选的缓冲参数指定文件所需的缓冲区大小:0 表示无缓冲,1 表示行缓冲,任何其他正值表示使用(大约)该大小(以字节为单位)的缓冲区。负缓冲意味着使用系统默认值。如果省略,则使用系统默认值。”。
当我使用

filedata = open(file.txt,"r",0)  

或者

filedata = open(file.txt,"r",1)  

或者

filedata = open(file.txt,"r",2)

或者

filedata = open(file.txt,"r",-1) 

或者

filedata = open(file.txt,"r")

output 没有变化。 上面显示的每一行都以相同的速度打印。
output:

憨豆先生是一部英国电视连续剧,由 15 名 25-

分钟剧集由罗宾·德里斯科尔编剧,罗温·阿特金森主演

标题字符。 罗宾也写了不同的剧集

Driscoll 和 Richard Curtis,还有 Ben Elton 的。 十三的

剧集在 ITV 播出,从 1990 年 1 月 1 日试播,直到

1995 年 10 月 31 日的“晚安憨豆先生”。剪辑节目“The Best Bits of

憨豆先生”于1995年12月15日播出,其中有一集“Hair by

伦敦憨豆先生”直到 2006 年才在 Nickelodeon 上播出。

那么open()中的buffering参数function有什么用呢? 什么价值

哪个缓冲参数最好用?

启用缓冲意味着您不会直接与操作系统的文件表示或其文件系统 API 交互。 取而代之的是,从原始操作系统文件流中将一大块数据读取到缓冲区中,直到它被消耗为止,此时更多的数据被提取到缓冲区中。 就您获得的对象而言,您将获得一个包装底层RawIOBase (代表原始文件流)的BufferedIOBase对象。

这有什么好处? 与原始流的良好接口可能具有很高的延迟,因为操作系统必须在硬盘等物理对象上四处游荡,这可能并非在所有情况下都可以接受。 假设您想每 5 毫秒从一个文件中读取三个字母,并且您的文件位于一个老旧的硬盘上,甚至是网络文件系统上。 与其每 5ms 尝试从原始文件流中读取一次,不如将一堆字节从文件加载到内存中的缓冲区中,然后随意使用它。

您选择的缓冲区大小取决于您使用数据的方式。 对于上面的示例,1 个字符的缓冲区大小会很糟糕,3 个字符就可以了,任何不会对您的用户造成明显延迟的 3 个字符的大倍数都是理想的。

您还可以通过从 io 模块调用只读 DEFAULT_BUFFER_SIZE 属性来检查默认缓冲区大小。

import io
print (io.DEFAULT_BUFFER_SIZE)

如上所述这里

缓冲是将文件块存储在临时内存中直到文件完全加载的过程。 在python中可以给出不同的值。 如果缓冲设置为 0 ,则缓冲关闭。 当我们需要缓冲文件时,缓冲将设置为 1。

从实用的角度来看,也许重要的是缓冲参数确定您发送到 stream 的数据何时实际保存到磁盘。

当你打开一个没有缓冲参数的文件,并向它写入一些东西时,你会看到数据只在with open(...) as foo:块退出后写入(或者当文件的close()方法是调用),或者达到某些系统确定的默认缓冲区大小时。 但是如果你设置buffering参数,它会在达到缓冲区大小后立即写入数据。

因此,使用 ie open('file.txt', 'w', buffering=1)是一个有用的事情,当你有一个长时间运行的应用程序时,你正在向一个文件发送一些数据,并且你希望它保存在每一行之后,而不仅仅是在应用程序退出之后。 否则死机或停电等可能会导致数据丢失。

另请参阅: python 多久刷新一次文件?

缓冲设置为 -1 时,我的文件写入需要 13 分钟。 缓冲设置为 2**10 时,我的文件写入需要 7 秒。 所以,缓冲的目的是加速你的程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM