并行I/O - 为何有效?

7 投票
1 回答
1321 浏览
提问于 2025-04-18 00:38

我有一个Python函数,它从一个文本文件中读取一行,然后把这行写入另一个文本文件。这个过程会对文件中的每一行重复进行。简单来说就是:

Read line 1 -> Write line 1 -> Read line 2 -> Write line 2...

接下来就是这样。

我可以把这个过程并行化,也就是使用一个队列来传递数据,这样就变成了:

Read line 1 -> Read line 2 -> Read line 3...

              Write line 1 -> Write line 2....

我想问的是——为什么这样做会更快(也就是说,为什么我能提高速度)?听起来这个问题有点傻,但我在想——难道我的硬盘一次只能做一件事吗?那为什么一个进程不会等另一个完成后再开始呢?

在使用高级语言编程时,这些事情对用户来说是隐藏起来的……我想知道底层到底发生了什么?

1 个回答

8

简单来说,就是输入输出缓冲。这里面甚至有两个层次。

首先,Python本身就有输入输出缓冲。所以,当你把很多行写入文件时,Python并不会立刻调用write这个系统调用——它会等到清空缓冲区的时候才会执行,这个时间可能是在你调用写入的时候,也可能是在你关闭文件的时候。如果你自己直接调用系统调用,这种情况就不会影响到你。

除此之外,操作系统也会有自己的缓冲。这些缓冲的工作原理是一样的——你调用“写入磁盘”的系统调用,操作系统会把数据放到它的写入缓冲中,然后在其他进程读取这个文件时使用这些数据。但这并不意味着数据已经写入磁盘,它可能会等到你卸载这个文件系统(比如关机的时候)才真正写入。这就是为什么在没有卸载或“安全移除”USB存储设备的情况下拔掉它可能会有问题的原因之一——你写入的数据可能还没有真正存储在设备上。操作系统的这些行为和你使用的编程语言无关,也和你对系统调用的封装程度无关。

此外,Python和操作系统还可以进行读取缓冲——简单来说,当你从文件中读取一行时,Python或操作系统会预判你可能还想读取接下来的几行,因此会把这些行提前读入内存,以避免之后再去磁盘读取。

撰写回答