Я бы просто расширил ответ phihag.
При попытке сериализации объекта, приближающегося к размеру оперативной памяти, pickle / cPickle следует избегать , поскольку для требуются дополнительныепамять в 1-2 раза больше объекта для сериализации.Это правда даже при потоковой передаче в BZ2File.В моем случае у меня даже заканчивалось пространство подкачки.
Но проблема с JSON (и аналогично с файлами HDF, как упомянуто в связанной статье) заключается в том, что он не может сериализовать кортежи, которые в моих данных используются какключи к диктовке.Там нет отличного решения для этого;лучшее, что я смог найти, - это преобразовать кортежи в строки, что требует некоторой памяти, но гораздо меньше, чем pickle.В настоящее время вы также можете использовать библиотеку ujson , которая намного быстрее, чем библиотека json.
Для кортежей, состоящих из строк (требуется, чтобы строки не содержали запятых):
import ujson as json
from bz2 import BZ2File
bigdata = { ('a','b','c') : 25, ('d','e') : 13 }
bigdata = dict([(','.join(k), v) for k, v in bigdata.viewitems()])
f = BZ2File('filename.json.bz2',mode='wb')
json.dump(bigdata,f)
f.close()
Чтобы перекомпоновать кортежи:
bigdata = dict([(tuple(k.split(',')),v) for k,v in bigdata.viewitems()])
В качестве альтернативы, если, например, ваши ключи представляют собой 2 кортежа целых чисел:
bigdata2 = { (1,2): 1.2, (2,3): 3.4}
bigdata2 = dict([('%d,%d' % k, v) for k, v in bigdata2.viewitems()])
# ... save, load ...
bigdata2 = dict([(tuple(map(int,k.split(','))),v) for k,v in bigdata2.viewitems()])
Еще одно преимущество этого подхода перед рассолом состоит в том, чтоjson, по-видимому, сжимает значительно лучше, чем соленья при использовании сжатия bzip2.