Мне было интересно, может ли кто-нибудь знать ответ на следующий вопрос:
Я использую Python для построения дерева суффиксов на основе символов. В дереве более 11 миллионов узлов, которые умещаются примерно в 3 ГБ памяти. Это было меньше 7 ГБ за счет использования метода класса слота , а не метода Dict .
Когда я сериализую дерево (с использованием самого высокого протокола), полученный файл больше, чем в сотни раз меньше.
Когда я снова загружаю заквашенный файл, он снова занимает 3 ГБ памяти. Откуда берутся эти дополнительные накладные расходы, это как-то связано с обработкой Pythons ссылок в памяти на экземпляры классов?
Обновление
Спасибо larsmans и Gurgeh за очень полезные объяснения и советы. Я использую дерево как часть интерфейса поиска информации по корпусу текстов.
Сначала я сохранил дочерние элементы (максимум 30) как массив Numpy, затем попробовал аппаратную версию ( ctypes.py_object * 30
), массив Python ( ArrayType
), а также типы Dictionary и Set.
Списки, кажется, работают лучше (с использованием гуппи для профилирования памяти и __ slots __ ['variable', ...]
), но я все еще пытаюсь немного сжать его, если я Можно. Единственная проблема, с которой я столкнулся с массивами, - это необходимость заранее указывать их размер, что приводит к некоторой избыточности узлов с одним дочерним элементом, и у меня их довольно много. ; -)
После того, как дерево построено, я намереваюсь преобразовать его в вероятностное дерево вторым проходом, но, возможно, я смогу сделать это, когда дерево будет построено. Поскольку в моем случае время построения не слишком важно, array.array () звучит как нечто, что было бы полезно попробовать, спасибо за подсказку, очень признателен.
Я дам вам знать, как это происходит.