可能重複:
Lazy Method for Reading Big File in Python?有效的方式在Python讀取數據
我需要從文件裏逐行讀取數據的100 GB(400萬條用戶線)。這是我目前的代碼,但有沒有任何有效的方法來做到這一點。 我的意思是在執行速度方面。
f = open(path, 'r')
for line in f:
...
f.close()
可能重複:
Lazy Method for Reading Big File in Python?有效的方式在Python讀取數據
我需要從文件裏逐行讀取數據的100 GB(400萬條用戶線)。這是我目前的代碼,但有沒有任何有效的方法來做到這一點。 我的意思是在執行速度方面。
f = open(path, 'r')
for line in f:
...
f.close()
不完全重複。另一個問題(和它的答案)是針對二進制文件的。 – jsbueno 2011-04-04 18:05:04
如果行固定字節長度,而線不必在被讀取複製任何特定的順序(你仍然可以知道行號),比你可以很容易地將它分成平行的子任務,以m多線程/進程。每個substusk只需要知道到何處seek()
和多少個字節到read()
。
此外,在這種情況下,逐行讀取並不是最理想的,因爲它需要掃描\n
,而只是使用固定長度的read()
。
如果您有一個多核計算機,並且可以使用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)
您有單個100 GB文件? – 2011-04-04 14:17:14
這幾乎是最好的方法。 – 2011-04-04 14:18:06
令人難以置信。很明顯,如果它產生100GB的文件,應用程序中出現了一些問題:-) – 2011-04-04 14:19:22