2015-03-02 150 views
2

我要閱讀大約7 GB的文本文件。閱讀大文本文件和內存

每當我嘗試讀取此文件時,所花費的時間比我預期的要長。

例如,假設我有350 MB的文本文件,而且我的筆記本電腦需時約一分鐘或更短。如果我想讀7GB,理想情況下應該花20分鐘或更少。不是嗎?礦山比我預期的要長得多,我想縮短閱讀和處理數據的時間。

我使用下面的代碼閱讀:

for line in open(filename, 'r'): 
    try: 
     list.append(json.loads(line)) 
    except: 
     pass 

讀取文件後,我用來處理使另一個列表和殺害前面的列表過濾掉從列表中不必要的數據。 如果您有任何建議,請讓我知道。

+0

多少內存你有? 100GB? – Daniel 2015-03-02 18:43:19

+0

@Daniel 4GB是我的筆記本電腦內存 – 2015-03-02 18:44:12

+0

通過擴展json,你所做的不僅僅是將文件讀入內存。取決於json是什麼,將序列化數據擴展到對象後的python內存佔用空間很容易大於7GB。 – tdelaney 2015-03-02 19:01:26

回答

7

由於您沒有足夠的內存來保存內存中的所有數據,因此7GB文件可能會佔用大大超過20 x 350mb的文件。這意味着,在某些時候,您的操作系統將啓動一些數據 - 將數據從內存寫入磁盤 - 以便內存可以重新使用。

這是很慢,因爲你的硬盤是顯着慢於RAM,並在7GB將有大量的數據從您的硬盤讀取,放入RAM,然後移回到您的頁面文件(該文件磁盤上的操作系統用來存儲從RAM中複製的數據)。

我的建議是重新工作你的程序,以便它只需要在內存中一次存儲一小部分文件。根據你的問題,你可以通過將一些邏輯移動到讀取文件的循環中來做到這一點。

lines = [] 
for line in open("myfile"): 
    lines.append(json.loads(line)) 
for line in lines: 
    if "ERROR" in line: 
     print line 

爲:舉例來說,如果你的程序試圖找到並打印所有包含「ERROR」行,你可以把它從重新寫

for line_str in open("myfile"): 
    line_obj = json.loads(line_str) 
    if "ERROR" in line_obj: 
     print line_obj 
+0

是的,我的筆記本電腦有4GB內存。那麼我應該削減小於4GB的數據並單獨運行? – 2015-03-02 18:43:41

+0

這是一種方法。你也可以重新工作你的程序,這樣它一次只能使用文件的一小部分。 – 2015-03-02 18:47:48

+0

還有一個問題!在您的代碼: 在開放line_str( 「MYFILE」): line_obj = json.loads(line_str) 如果 「ERROR」 的行: 打印line_obj 如果 「ERROR」 的行:<< ===在這裏的「line」,你的意思是line_obj? – 2015-03-02 19:04:09