Почему dill.dump из списка словарей (81 000 000 байтов) занимает вечность? - PullRequest
0 голосов
/ 08 февраля 2019

Я создал список словаря из 8100000 байтов, с 9 миллионами + элементов.Каждый элемент имеет словарь из 32 пар значений и ключей, хотя в каждом элементе используется один и тот же набор ключей.

Я хотел сохранить его для дальнейшего анализа.Я пробовал dill.dump, но это заняло целую вечность (более 1 часа), что мне пришлось прерывать ядро.Предполагается, что это будет быстро и легко, верно?

Вот что я пробовал:

import dill
output_file=open('result_list', 'wb')
dill.dump(result_list, output_file)
output_file.close()

Я также пробовал pickle и bzip2

import bz2
import pickle
output_file=bz2.BZ2File('result_list', 'w')
pickle.dump(result_list, output_file)

Но побежалв память ошибки.

Какие-нибудь советы, как сделать это возможным и менее трудоемким?Спасибо!

1 Ответ

0 голосов
/ 08 февраля 2019

Я dill автор.Вы можете попробовать klepto для этого случая.dill (фактически любой сериализатор) будет обрабатывать весь dict как единый объект ... и что-то такого размера, вы можете захотеть рассматривать больше как базу данных записей ... что может сделать klepto,Наиболее быстрый подход, вероятно, заключается в использовании архива, который обрабатывает каждую запись как отдельный файл в отдельном каталоге на диске:

>>> import klepto
>>> x = range(10000)
>>> d = dict(zip(x,x))
>>> a = klepto.archives.dir_archive('foo', d)
>>> a.dump()

В приведенном выше примере создается каталог с 10000 подкаталогами с одной записью в каждом.Ключи и значения хранятся.Обратите внимание, что вы также можете немного подправить метод сериализации, поэтому проверьте документы, чтобы узнать, как это сделать для своего пользовательского случая.

В качестве альтернативы, вы можете перебирать dict и сериализовать каждую запись с помощью dumpвнутри параллельной карты из multiprocess.Pool.

(Примечание: я также являюсь автором multiprocess и klepto).

ОБНОВЛЕНИЕ: каквопрос был изменен с сериализации огромного диктата на сериализацию огромного списка маленьких диктов ... это меняет ответ.

klepto создан для больших dict -подобных структур, так что, вероятно,не то, что вы хотите.Возможно, вы захотите попробовать dask, который построен для больших array -подобных структур.

Я думаю, вы могли бы также выполнить итерацию по списку, сериализовав каждую из записей списка индивидуально ... и до тех пор, показагрузив их в том же порядке, вы сможете восстановить свои результаты.Вы могли бы сделать что-то вроде сохранения позиции со значением, чтобы вы могли восстановить список и затем отсортировать, если они вышли из строя.

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

...