2011-04-04 35 views
4

可能重複:
Lazy Method for Reading Big File in Python?有效的方式在Python讀取數據

我需要從文件裏逐行讀取數據的100 GB(400萬條用戶線)。這是我目前的代碼,但有沒有任何有效的方法來做到這一點。 我的意思是在執行速度方面。

f = open(path, 'r') 

for line in f: 
    ... 

f.close() 
+0

您有單個100 GB文件? – 2011-04-04 14:17:14

+2

這幾乎是最好的方法。 – 2011-04-04 14:18:06

+0

令人難以置信。很明顯,如果它產生100GB的文件,應用程序中出現了一些問題:-) – 2011-04-04 14:19:22

回答

2

如果行固定字節長度,而線不必在被讀取複製任何特定的順序(你仍然可以知道行號),比你可以很容易地將它分成平行的子任務,以m多線程/進程。每個substusk只需要知道到何處seek()和多少個字節到read()

此外,在這種情況下,逐行讀取並不是最理想的,因爲它需要掃描\n,而只是使用固定長度的read()

1

如果您有一個多核計算機,並且可以使用Python 3.2(而不是Python 2),這將是Python 3.2 - 中的concurrent.futures新功能的良好用例,具體取決於您需要對每個進行的處理線。如果您需要按照文件順序進行處理,那麼稍後可能不得不擔心重新組合輸出。

否則,使用concurrent.futures可以毫不費力地安排每個客戶端在不同的任務中處理。你必須在那產生什麼輸出?

如果你認爲你不會從並行化每行內容中獲益,最明顯的方法就是最好的方法:就是你剛剛做的。

本示例將處理分爲12個子進程,每個子進程執行Python的內置函數len

from concurrent.futures import ProcessPoolExecutor as Executor 

with Executor(max_workers=5) as ex: 
    with open("poeem_5.txt") as fl: 
     results = list(ex.map(len, fl)) 

是必須的「名單」的號召,以強制映射被內「同向」語句來完成:爲接收線作爲參數,並執行任何你需要在該行處理的函數替換len 。如果您不需要每行的標量值,而是將結果記錄到文件中,則可以在for循環中執行此操作:

for line in fl: 
    ex.submit(my_function, line) 
相關問題