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