问题:什么是全缓冲、行缓冲和无缓冲?
这里的缓冲是指用户层的I/O缓冲区,不是内核缓冲。
- 全缓冲:填满标准I/O缓存区才进行实际的I/O操作。磁盘上的文件用标准I/O打开,默认都是全缓存的。当缓存区填满或者进行flush操作时候才会进行磁盘操作。
- 行缓冲:当输入输出遇到换行符时候就是行缓存了。标准输入和标准输出都是行缓存。
- 无缓冲:用户层不提供缓冲,对流的读写可以立即操作实际文件。典型例子就是标准错误输出,因为它必须尽快输出,且是输出到具有交互式的设备商,如屏幕,不是磁盘。
上述都是I/O缓冲区,其作用是减少read和write的次数,即减少了系统调用,从而减少了系统开销,提高了I/O速度。
内核缓冲区:从理论上讲,内核可以在任何时候写磁盘,但并不是所有的write操作都会导致内核的写动作。内核会把要写的数据暂时存在缓冲区中,积累到一定数量后再一次写入。有时会导致意外情况,比如断电,内核还来不及把内核缓冲区中的数据写到磁盘上,这些更新的数据就会丢失。
问题:python设置文件缓冲类型
# 设置定长缓冲区
path = 'test.txt'
with open(path, 'w+', encoding='utf-8', buffering=20) as f:f.write('hello')f.write('hello')# 设置行缓冲
with open(path, 'w+', encoding='utf-8', buffering=1) as f:f.write('hello \n')f.write('hello1 \n')f.write('hello2 \n')# 设置无缓冲
with open(path, 'wb+', buffering=0) as f:f.write(b'hello')f.write(b'hello1')