2014-10-02 64 views
2

举个例子,假设我们有3个CSV文件以百万计的文件中的行:Python中处理多个文件

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

这取决于你在做什么样的处理和其他细节。如果没有运行代码和测量时间,很难说哪一个更快。 – kraskevich 2014-10-02 17:04:06

+0

@ user2040251说的是:*取决于*。我们需要更多的上下文,例如:你现在的边界是cpu还是IO?对执行进行剖析以确定最慢的部分是什么,然后才将这些作为优化目标。 – smassey 2014-10-02 19:45:42

回答

4

由于Global Interpreter Lock,使用线程处理文件的某些部分根本不会提高性能(假设您使用CPython)。一次只有一个线程可以运行Python字节码,所以无论何时您的线程需要做一些事情而不是阻塞I/O,只有一个线程可以实际并发运行。所以你最终基本上是按顺序处理文件,只是由于在线程之间切换而引起额外的开销。

因此,在您提出的两个选项中,前者的表现会更好。但是,如果系统上有3个以上的CPU核心,则可以进一步提高性能,方法是分割这些文件,以便系统上的每个可用内核都在其进程中处理一个文件块(从而避免使用GIL) 。做到这一点的最佳方式取决于你对每个csv文件进行什么样的处理。你是否将来自csv的数据放入内存中的数据结构中?在每一行上做某种计算?等等。