Использование cPickle для сериализации большого словаря вызывает ошибку MemoryError

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

Модель данных выглядит примерно так: {word: {doc_name: [location_list]}}

Построение индекса в памяти работает нормально, но при попытке сериализации на диск возникает ошибка MemoryError. Вот мой код:

# Write the index out to disk
serializedIndex = open(sys.argv[3], 'wb')
cPickle.dump(index, serializedIndex, cPickle.HIGHEST_PROTOCOL)

Непосредственно перед сериализацией моя программа использует около 50% памяти (1,6 ГБ). Как только я вызываю cPickle, мое использование памяти резко возрастает до 80% перед сбоем.

Почему cPickle использует так много памяти для сериализации? Есть ли лучший способ решить эту проблему?

8
задан Stephen Poletto 18 February 2011 в 03:52
поделиться