并行I / O - 为什么它可以工作?

时间:2014-03-31 06:53:12

标签: python io parallel-processing

我有一个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 个答案:

答案 0 :(得分:8)

简而言之:IO缓冲。它的两个层次,甚至。

首先,Python本身有IO缓冲区。因此,当您将所有这些行写入文件时,Python不一定立即调用write系统调用 - 它会在刷新缓冲区时执行此操作,这可能是从您调用write到关闭文件时的任何时间。如果你自己编写系统调用这样的级别,这显然不会影响你。

但与此分开,操作系统实现缓冲区。这些工作方式相同 - 您将'写入磁盘'系统调用,操作系统将数据放入其写入缓冲区,并在其他进程读取该文件时使用该数据。但它并不一定将它写入磁盘 - 理论上它可以等待,直到你卸载该文件系统(可能在关机时)。这是(部分)为什么在没有卸载或“安全删除”它的情况下拔出USB存储设备是个坏主意 - 你写的东西不一定是物理在设备上。操作系统所做的任何事情都不会受到您正在编写的语言的影响,也不会影响您所拥有的系统调用的包装程序。

除此之外,Python和操作系统都可以执行读缓冲 - 实质上,当您从文件中读取一行时,Python /操作系统预计您可能对下几行感兴趣,因此读取它们进入主内存,以避免以后不得不一直推迟到磁盘本身。