python 写文件的buffer策略

当你使用python 的 open函数打开一个文件并向其中写入数据时,数据并不会立即落入磁盘,而是在缓冲区缓存,何时写入磁盘,是由buffering参数决定的。这样做是为了减少磁盘的写入次数,等到数据积累到一定量时一次性写入到磁盘。

程序中实行flush可以强制将缓冲区的数据写入到磁盘,文件在close时也会将缓冲区里的数据写入到磁盘。

一般来说,我们不关心缓冲区的缓冲大小和策略,但特殊情况下,你可以使用buffering参数进行设置。

buffering 的取值只有 -1, 0, 1 , > 1 四种取值,对于本文文件和二进制文件,也有着不同的策略。

文件类型 buffering=-1 buffering=0 buffering=1 buffering > 1
二进制 io.DEFAULT_BUFFER_SIZE 禁止缓存 1 buffering
文本 1 io.DEFAULT_BUFFER_SIZE 不允许设置为0 line buffering io.DEFAULT_BUFFER_SIZE

二进制文件可以通过设置buffering=0 禁止缓存,而文本文件不可以禁止缓存,文本文件要么设置为行缓存,要么设置缓存区大小为io.DEFAULT_BUFFER_SIZE。

文本文件写入时,设置缓存策略为行缓存,每写入一行数据,就会同步到磁盘上,下面这个程序可以验证

import time

with open('./test.txt', 'w', buffering=1)as f:
    for i in range(10):
        f.write(str(time.time()) + "\n")
        time.sleep(3)

程序会运行30秒,每隔3秒钟向文件中写入一行时间,若不设置buffering等于1,在程序结束之前test.txt里不会有任何数据写入,io.DEFAULT_BUFFER_SIZE大小是8192,程序写的数据还远远不够。但由于设置了行缓存策略,因此每写一行就会同步一行,在test.txt文件里每隔3秒钟就会出现一行新的数据。

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案