這聽起來像你的代碼是I/O綁定。這意味着多處理不會對你有幫助 - 如果你花費90%的時間從磁盤讀取數據,那麼在下一次讀取時等待下一個額外的7個進程是無助於任何事情的。
而且,使用CSV閱讀模塊(無論stdlib的csv
還是類似NumPy或Pandas的內容)可能是一個簡單的好主意,它不太可能在性能上有很大的不同。
不過,值得檢查一下,你真的是 I/O綁定,而不是隻是猜測。運行你的程序,看你的CPU使用率是接近0%還是接近100%或核心。做Amadan在評論中建議的內容,然後運行程序pass
進行處理,看看它是否會削減5%或70%的時間。你甚至可以試着比較一下os.open
和os.read(1024*1024)
之類的循環,看看它是否更快。
由於您使用Python 2.x中,Python是依靠C STDIO庫猜測多少在一個時間緩衝,所以它可能是值得迫使緩衝更多。最簡單的方法是對bufsize
使用readlines(bufsize)
。 (您可以嘗試不同的數字並測量它們以查看峯值的位置。根據我的經驗,通常64K-8MB的任何數值都差不多,但根據您的系統可能會有所不同 - 尤其是如果您閱讀關閉以極大的吞吐量,但可怕的延時的網絡文件系統,沼澤實際的物理驅動器和OS做緩存的吞吐量與延遲)
因此,舉例來說:
bufsize = 65536
with open(path) as infile:
while True:
lines = infile.readlines(bufsize)
if not lines:
break
for line in lines:
process(line)
同時,假設您使用的是64位系統,則可能需要嘗試使用mmap
而不是首先讀取該文件。這當然不是保證要好一些,但它可能會更好,這取決於您的系統。例如:
with open(path) as infile:
m = mmap.mmap(infile, 0, access=mmap.ACCESS_READ)
一個Python mmap
是排序一個奇怪的物體,它像一個str
和像file
在同一時間,這樣就可以,例如,用於換行手動迭代掃描,或者可以調用readline
就好像它是一個文件一樣。這兩種方法都需要從Python進行更多的處理,而不是像批處理文件那樣迭代文件或執行批處理readlines
(因爲循環將在C中現在處於純Python中......雖然也許您可以通過re
或簡單的Cython擴展?)...但是,操作系統的I/O優勢知道你在映射中做什麼可能會縮小CPU的劣勢。
不幸的是,Python並沒有公開調用madvise
調用來嘗試在C中優化它(例如,明確設置MADV_SEQUENTIAL
而不是猜測內核,或者強制透明的巨大頁面) - 但你實際上可以在libc
之外的功能。
multiprocessing;分塊迭代閱讀。在每個文件3GB的時候,你不會**想完全讀入內存;你可能會吹掉你的內存資源。 –
這聽起來像一個數據庫將幫助你取決於你正在處理的類型。 – squiguy
如果這是一次性拋棄任務,則不需要;數據中;處理;數據輸出;刪除源數據。 –