当前位置: 代码迷 >> 综合 >> python基础——I/O缓冲
  详细解决方案

python基础——I/O缓冲

热度:65   发布时间:2024-02-07 18:10:08.0

问题:什么是全缓冲、行缓冲和无缓冲?

这里的缓冲是指用户层的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')

 

  相关解决方案