2016-07-24 3 views
0

Это код python, который я использую. У меня есть файл 5gb, который мне нужно разделить примерно на 10-12 файлов в соответствии с номерами строк. Но этот код дает ошибку памяти. Пожалуйста, может кто-нибудь сказать мне, что не так с этим кодом?Разделение большого файла на файл меньшего размера, дающий ошибку памяти

from itertools import izip_longest 

def grouper(n, iterable, fillvalue=None): 
    "Collect data into fixed-length chunks or blocks" 
    # grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx 
    args = [iter(iterable)] * n 
    return izip_longest(fillvalue=fillvalue, *args) 

n = 386972 

with open('reviewsNew.txt','rb') as f: 
    for i, g in enumerate(grouper(n, f, fillvalue=''), 1): 
     with open('small_file_{0}'.format(i * n), 'w') as fout: 
      fout.writelines(g) 
+0

http://stackoverflow.com/questions/6475328/read-large-text-files-in- python-line-by-line-without-load-it-in-to-memory Аналогичный вопрос –

+0

@be_good_do_good это не то же самое. В моем коде после 3-4 итераций, я получаю ошибку памяти. Я не знаю, почему. Я читаю файл строки за строкой :( –

+0

, возможно, не проблема, но вы открываете входной файл как двоичный, но вы не сохраняете тот же путь. –

ответ

0

Просто используйте GroupBy, так что вам не нужно создавать 386972 итераторы:

from itertools import groupby 

n = 386972 
with open('reviewsNew.txt','rb') as f: 
    for idx, lines in groupby(enumerate(iterable), lambda (idx, _): idx // n): 
     with open('small_file_{0}'.format(idx * n), 'wb') as fout: 
      fout.writelines(l for _, l in lines) 
+0

Это также дало ошибку памяти. У меня есть 4 ГБ оперативной памяти и файл, который я пытаюсь разбить, составляет около 6 ГБ. Является ли это вопросом? Я читаю файл по строкам, чтобы он не сохранял весь файл в памяти, поэтому он должен работать правильно? –

+0

У вас очень длинная строка (> 4 ГБ) в вашем файле? – Daniel

+0

Я не знаю. Как я могу это проверить? –

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