Python处理多个文件

时间:2014-10-02 16:59:45

标签: python multithreading multiprocessing

举个例子,假设我们有3个CSV文件,每个文件有数百万行:

file_1.csv contains 10 million lines
file_2.csv contains 2.5 million lines
file_3.csv contains 7.1 million lines

我知道我可以使用Python的multiprocessing library并在每个进程使用一个线程的单独进程中处理每个文件。

另一个想法是在一个单独的进程中处理每个文件,如上所述,但在每个进程中有多个线程处理文件的块。例如:

Process 1
  file_1.csv being processed
  thread 1 is processing the first 1 million lines
  thread 2 is processing the second 1 million lines
  etc…
  combine thread results

...等等,进程2和3。

所以,我的问题是,处理这些文件的最快方法是什么?

1 个答案:

答案 0 :(得分:4)

由于Global Interpreter Lock,使用线程处理文件的某些部分根本不会提高性能(假设您正在使用CPython)。只有一个线程可以一次运行Python字节码,因此每当线程需要执行除阻塞I / O之外的操作时,只有一个线程可以实际并发运行。因此,您最终会按顺序处理文件,只会因线程之间切换而产生额外开销。

因此,在您提出的两个选项中,前者的表现会更好。但是,如果系统上有超过3个CPU内核,通过拆分文件以便系统中的每个可用内核在其自己的进程中处理一个文件块(因此避免使用GIL),您可以进一步提高性能。最好的方法取决于您对每个csv文件执行何种处理。您是否将来自csv的数据放入内存中的数据结构?在每一行做某种计算?等等。