经常使用少量添加对文件对象调用write()是不是很糟糕?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经常使用少量添加对文件对象调用write()是不是很糟糕?相关的知识,希望对你有一定的参考价值。

我正在重构一个可怕的python脚本,它是生成lua绑定的polycode项目的一部分。

我正在考虑在块中生成lua线,因为它们是生成的。

但我的通用形式的问题是,很快写入文件有什么不利/警告?

举个例子:

persistent_file = open('/tmp/demo.txt')

for i in range(1000000):
    persistent_file.write(str(i)*80 + '
')


for i in range(2000):
    persistent_file.write(str(i)*20 + '
')


for i in range(1000000):
    persistent_file.write(str(i)*100 + '
')


persistent_file.close()

这只是一种基本上尽可能快地写入文件的简单方法。我真的不希望在这方面遇到任何实际问题,但我确实希望得到通知,缓存一个大写是否有利?

答案

open函数的文档:

open(file,mode ='r',buffering = -1,encoding = None,errors = None,newline = None,closefd = True,opener = None) - > file object

...

buffering是一个可选的整数,用于设置缓冲策略。传递0以切换缓冲关闭(仅允许在二进制模式下),1选择行缓冲(仅在文本模式下可用),并且整数> 1以指示固定大小的块缓冲区的大小。如果没有给出缓冲参数,则默认缓冲策略的工作方式如下:

  • 二进制文件以固定大小的块缓冲;使用启发式方法选择缓冲区的大小,尝试确定底层设备的“块大小”并回退到io.DEFAULT_BUFFER_SIZE。在许多系统上,缓冲区通常为4096或8192字节长。
  • “交互式”文本文件(isatty()返回True的文件)使用行缓冲。其他文本文件使用上述策略用于二进制文件。

换句话说,在大多数情况下,频繁调用write()时遇到的唯一开销是函数调用的开销。

以上是关于经常使用少量添加对文件对象调用write()是不是很糟糕?的主要内容,如果未能解决你的问题,请参考以下文章

第三章 文件 I/O

《Linux设计与实现》笔记——系统调用工作原理添加系统调用的过程

c++ fstream对象调用write函数后,文件大小为啥还是0KB?

html页面加载JS文件经常错误

为啥 sys.stdout.write 被调用两次?

如何从对象列表中删除少量对象