一、什么是文件的缓冲?
1、说明
将文件内容写入到硬件设备时,比如磁盘的扇区,则需要进行系统调用,这类I/O操作的耗时很长,为了减少I/O操作的次数,文件通常使用缓冲区(当需要写入的字节数不足一个块时,将数据放入缓冲区,当数据凑够一个块的大小后才进行系统调用);
2、文件的缓冲行为:
A、全缓冲:只有当数据凑够一个块时,才进行系统调用(即I/O操作);
B、行缓冲:碰到一个换行符,就进行一次系统调用;(多用于tty设备,也就是终端设备,如shell)
C、无缓冲:不进行缓冲,需要及时的将数据发送到接口;(比如串口设备)
3、备注
- 系统调用:向操作系统申请一个服务,操作系统响应后,帮助调用硬件的驱动程序,这种操作称为I/O操作;
- 磁盘扇区:硬盘的内部圆形金属盘片被磁道划分成若干个扇形区域,这就是硬盘扇区。若干个扇区就组成整个盘片,硬盘的读写以扇区为基本单位。
- 对于磁盘这类的块设备,读写时不是按单个字节进行的,而是按块,每次读写一个块(一般一个块大小4096个字节);如果一个块的大小是4096个字节,则写入一个字节和写入4096个字节,都需要进行一次I/O操作,用时则是相同的;
二、Python中,文件的对象的缓冲行为
# python中普通文件默认的缓冲行为:全缓冲,当凑够一个块的数据(4096个字节,也是缓冲区的大小)后,才进行系统调用(也就是I/O操作);
# 缓冲区的大小,是根据平台(如python)和块设备(如磁盘)自身的属性相关的;
设置缓冲模式,及缓冲区大小:
格式:open(file, 'r', buffering = n/1/0)
A、buffering = n,n > 1 :设定缓冲模式为全缓冲,缓冲区大小为n个字节;
B、buffering = 1:设定缓冲模式为行缓冲,遇到换行符 ' ' 时进行系统调用,也就是I/O操作,将数据写入磁盘;
C、buffering = 0:此为无缓冲你模式,只要有数据,就直接进行系统调用,也就是进行I/O操作,将数据写入磁盘;