Python 内置的 open
函数有一个 buffering
参数,用来设置打开文件的缓冲策略(buffer policy)
什么是 Buffer ?
可以将 buffer 理解为 内存数据写入硬盘时 的中间层,用于减少硬盘的 写入次数
例如:
有一个 500 byte 的文件,一 byte 一 byte 的写入硬盘,要写 500 次,如果 50 byte 写一次,只需要写十次,无论是对于硬盘(减少写入次数) 还是系统(减少写入时的系统调用) 来说都是极好的事情
Python 写文件时候如何使用 buffer ?
Python 内置的 open 函数就带有 buffering 参数,用于设置打开文件的 buffer policy
open 函数对文件 buffer 的设置是对系统调用的封装,并不是 Python 本身实现的,而是系统 API 中早已提供的
对于不同参数(-1, 0, 1, > 1),不同类型的文件 (Binary/Text) 还有不同的策略
File Type | buffering=-1 | buffering=0 | buffering=1 | buffering>1 |
---|---|---|---|---|
Binary | io.DEFAULT_BUFFER_SIZE | unbuffered | 1 | buffering |
Text | io.DEFAULT_BUFFER_SIZE | 不允许 | line buffering | DEFAULT_BUFFER_SIZE |
名称 | 含义 |
---|---|
io.DEFAULT_BUFFER_SIZE | 系统默认的 buffer 大小 |
unbunffered | 不使用 buffer |
line buffering | 行缓冲 |
buffering | 指定缓冲区大小 |
实例
不理解 buffer 之前认为 open 函数打开的文件,写入了数据,如果不 close,或者不提前用 flush 是不会刷入硬盘的,实际上这和 buffer policy 有关,如果设置了 line buffering 的策略,则为每写一行数据就会刷入硬盘,如果指定 buffer size,写入大于 buffer size 数据才会刷入硬盘
line buffering
In [1]: f = open('line_buffer.txt', 'w', buffering=1) # line buffering 策略写文件 |
unbunffered
只有二进制文件才能禁用 buffer
In [10]: f = open('binary_unbuffered.txt', 'wb', buffering=0) |
指定 buffer size
也只有二进制文件才能指定 buffer size
In [18]: f = open('binary_buffer_size.txt', 'wb', buffering=10) #设置 buffer size 为 10 |