2015-01-21 2 views
4

Я обрабатываю некоторые данные, и я сохранил результаты в трех словарях, и я сохранил их на диск с помощью Pickle. Каждый словарь имеет 500-1000 МБ.MemoryError с Pickle in Python

Теперь я загрузив их с:

import pickle 
with open('dict1.txt', "rb") as myFile: 
    dict1 = pickle.load(myFile) 

Однако уже при загрузке первого словаря я получаю:

*** set a breakpoint in malloc_error_break to debug 
python(3716,0xa08ed1d4) malloc: *** mach_vm_map(size=1048576) failed (error code=3) 
*** error: can't allocate region securely 
*** set a breakpoint in malloc_error_break to debug 
Traceback (most recent call last): 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 858, in load 
    dispatch[key](self) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1019, in load_empty_dictionary 
    self.stack.append({}) 
MemoryError 

Как решить эту проблему? Мой компьютер имеет 16 ГБ оперативной памяти, поэтому я нахожу необычным, что загружается 800-мегабайтный словарь. То, что я также обнаруживаю необычным, заключается в том, что при сохранении словарей проблем не было.

Далее, в будущем я планирую обработать больше данных, приводящих к увеличению словарей (3-4 ГБ на диске), поэтому любые советы по повышению эффективности оцениваются.

+0

Какая ОС вы используете? Размер файла * на диске * или размер фактического использования памяти? –

+0

В зависимости от вашей ОС, сколько памяти может быть выделено для процесса. –

+0

Размер - это размер файла на диске. Я использую Mac OS 10.10. Есть ли способ настроить, сколько памяти может быть выделено? – flotr

ответ

4

Если ваши данные в словарях являются numpy массивов, есть пакеты (такие как joblib и klepto), которые делают засолки больших массивов эффективными, так как и в klepto и joblib понять, как использовать минимальное состояние представление для numpy.array. Если у вас нет данных array, мое предложение было бы использовать klepto для хранения записей в нескольких файлах (вместо одного файла) или в базе данных.

См. Мой ответ на очень близкий вопрос https://stackoverflow.com/a/25244747/2379433, если вы в порядке с травлением на несколько файлов вместо одного файла, хотели бы сохранить/загрузить данные параллельно или просто поэкспериментировать с хранилищем формат и бэкэнд, чтобы увидеть, какая из них лучше всего подходит для вашего дела. Также см .: https://stackoverflow.com/a/21948720/2379433 для других потенциальных улучшений, а также: https://stackoverflow.com/a/24471659/2379433.

В качестве ссылок, приведенных выше, вы можете использовать klepto - который предоставляет вам возможность легко хранить словари на диске или базе данных, используя общий API. klepto также позволяет вам выбрать формат хранения (pickle, json и т. Д.) - также HDF5 (или база данных SQL) - еще один хороший вариант, поскольку он обеспечивает параллельный доступ. klepto может использовать как специализированные форматы рассола (например, numpy), так и сжатие (если вас интересует размер, а не скорость доступа к данным).

дает вам возможность хранить словарь с файлом «все-в-одном» или «один-на-один», а также может использовать многопроцессорность или многопоточность - это означает, что вы можете сохранять и загружать словарные статьи в/из внутреннего блока параллельно. Примеры см. В приведенных выше ссылках.

+0

Спасибо за ваш ответ. Я сохранил рассол, но я радикально изменил свой код для создания массивов numpy со значительно меньшим размером. Теперь он работает нормально. – flotr

4

Это неотъемлемая проблема рассола, , который предназначен для использования с довольно небольшими количествами данных . Размер словарей при загрузке в память во много раз больше, чем на диске.

После загрузки файла рассола 100 МБ, у вас может быть словарь почти 1 ГБ или около того. Есть несколько формул в Интернете, чтобы рассчитать накладные расходы, но я могу только рекомендовать использовать приличную базу данных , такую ​​как MySQL или PostgreSQL, для таких объемов данных.

+0

Да ... Я знал, что размер не равен, но я не ожидал, что это соотношение может быть 10x ... – flotr