Сериализация памяти Python

Мне было интересно, может ли кто-нибудь знать ответ на следующий вопрос:

Я использую Python для построения дерева суффиксов на основе символов. В дереве более 11 миллионов узлов, которые умещаются примерно в 3 ГБ памяти. Это было меньше 7 ГБ за счет использования метода класса слота , а не метода Dict .

Когда я сериализую дерево (с использованием самого высокого протокола), полученный файл больше, чем в сотни раз меньше.

Когда я снова загружаю заквашенный файл, он снова занимает 3 ГБ памяти. Откуда берутся эти дополнительные накладные расходы, это как-то связано с обработкой Pythons ссылок в памяти на экземпляры классов?

Обновление

Спасибо larsmans и Gurgeh за очень полезные объяснения и советы. Я использую дерево как часть интерфейса поиска информации по корпусу текстов.

Сначала я сохранил дочерние элементы (максимум 30) как массив Numpy, затем попробовал аппаратную версию ( ctypes.py_object * 30 ), массив Python ( ArrayType ), а также типы Dictionary и Set.

Списки, кажется, работают лучше (с использованием гуппи для профилирования памяти и __ slots __ ['variable', ...] ), но я все еще пытаюсь немного сжать его, если я Можно. Единственная проблема, с которой я столкнулся с массивами, - это необходимость заранее указывать их размер, что приводит к некоторой избыточности узлов с одним дочерним элементом, и у меня их довольно много. ; -)

После того, как дерево построено, я намереваюсь преобразовать его в вероятностное дерево вторым проходом, но, возможно, я смогу сделать это, когда дерево будет построено. Поскольку в моем случае время построения не слишком важно, array.array () звучит как нечто, что было бы полезно попробовать, спасибо за подсказку, очень признателен.

Я дам вам знать, как это происходит.

10
задан Tim Post 14 June 2011 в 12:29
поделиться