2014-10-02 78 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的數據放入內存中的數據結構中?在每一行上做某種計算?等等。