2016-10-17 2 views
4

У меня есть текстовый файл 5gb, и я пытаюсь прочитать его по строкам. Мой файл находится в Формат-: Reviewerid < \ т> PID < \ т> Дата < \ т> название < \ т> тело < \ п> Это мой кодЗачем нужна ошибка памяти? 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") 

Но я получаю ошибку памяти когда я пытаюсь запустить его. У меня есть 8-гигабайтное ram и 1Tb пространство, то почему я получаю эту ошибку? Я попытался прочитать его в блоках, но затем также получил эту ошибку.

MemoryError 
+3

Как долго является самой длинной строки в этом файле? –

+0

@FranciscoCouzo Я не знаю. Но когда я пытаюсь открыть этот файл в EmEditor, появляется всплывающее окно, в котором «есть несколько очень больших строк. Вы хотите открыть его в двоичном формате». Выбирая двоичную опцию, он отображает файл правильно. –

+1

Что такое 'o' в' o.write() '? Если вы храните все, что вы читаете в памяти, я не удивлен, что вы получаете ошибку памяти. – Akavall

ответ

3

Update:

Установка 64-битной Python решает эту проблему.

ОП использовал 32-битный Python, поэтому попадание в ограничение памяти.


Читать все комментарии Я думаю, это может вам помочь.

  • Вы не можете прочитать файл в блоке (как 1024), так как хотите обрабатывать данные.
  • Вместо этого прочитайте файл в куске строк i.e по N строк за раз.
  • Ключевое слово yield и itertools в Python для достижения выше.

Резюме: Получить 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

Также, дайте мне знать, используете ли вы окна или Linux? –

Смежные вопросы