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