2016-10-17 30 views
4

我有一個5GB的文本文件,我想逐行讀取它。 我的文件是格式 - :Reviewerid < \ T> PID < \ T>日期< \ T>標題< \ T>體< \ N> 這是我的代碼爲什麼會出現內存錯誤? Python

o = open('mproducts.txt','w') 
with open('reviewsNew.txt','rb') as f1: 
    for line in f1: 
     line = line.strip() 
     line2 = line.split('\t') 
     o.write(str(line)) 
     o.write("\n") 

,但我得到內存錯誤當我嘗試運行它。我有一個8GB的RAM和1TB的空間,那麼爲什麼我得到這個錯誤?我試圖在塊中讀取它,但是我也得到了這個錯誤。

MemoryError 
+3

多久是在該文件中最長的行? –

+0

@FranciscoCouzo我不知道。但是當我嘗試在EmEditor中打開該文件時,出現一個彈出窗口:「它包含一些非常大的行,是否要以二進制格式打開它。」通過選擇二進制選項,它可以正確顯示文件。 –

+1

o.write()中的o是什麼?如果你正在保存你在內存中讀取的所有內容,我並不感到驚訝,你正在收到內存錯誤。 – Akavall

回答

3

更新:

安裝64位的Python解決了這個問題。

OP正在使用32位的Python,這就是爲什麼進入內存限制。


讀取整個評論我認爲這可以幫助你。

  • 由於您要處理數據,因此無法讀取塊(1024)中的文件。
  • 取而代之的是,一次讀取大塊行中的文件,即N行。
  • 您可以在Python中使用yield關鍵字和itertools來達到上述目的。

摘要:獲取N行時刻,過程,然後寫。

示例代碼:

from itertools import islice 
#You can change num_of_lines 
def get_lines(file_handle,num_of_lines = 10): 
    while True: 
     next_n_lines = list(islice(file_handle, num_of_lines)) 
     if not next_n_lines: 
      break 
     yield next_n_lines 


o = open('mproducts.txt','w') 

with open('reviewsNew.txt','r') as f1: 
    for data_lines in get_lines(f1): 
     for line in data_lines: 
      line = line.strip() 
      line2 = line.split('\t') 
      o.write(str(line)) 
      o.write("\n") 
o.close() 
+0

但我在逐行閱讀。我沒有記住任何東西。我讀了一行並將其寫入另一個文件。也是我最大的線路長度將在9000左右。是長度問題嗎? –

+0

我不認爲它是行長問題。我剛剛嘗試了行長10000。它工作正常。我的代碼對你有幫助嗎? –

+0

另外,讓我知道如果你使用Windows或Linux? –

相關問題