Компиляция в байтовый код занимает слишком много памяти

Мне нужно импортировать очень большой словарь в python, и я столкнулся с некоторыми неожиданными узкими местами в памяти. Словарь имеет форму

d = {(1,2,3):(1,2,3,4), (2,5,6)=(4,2,3,4,5,6), ... }

. Таким образом, каждый ключ представляет собой 3-кортеж, а каждое значение - относительно небольшой кортеж произвольного размера (вероятно, не более 30 элементов). Что делает словарь большим, так это количество ключей. Небольшой пример того, с чем я работаю, имеет примерно 247257 ключей. Я генерирую этот словарь посредством моделирования, поэтому я могу написать текстовый файл, который определяет этот словарь, и для примера, который я только что упомянул, это файл размером 94 МБ. Узкое место, с которым я сталкиваюсь, заключается в том, что первоначальная компиляция байтового кода Python съедает около 14 ГБ оперативной памяти. Итак, при первом импорте словаря я вижу, что использование ОЗУ резко возрастает, и через 10 секунд все загружается. Если файл .pyc уже создан, импорт происходит практически мгновенно. Используя pympler, я определил, что этот словарь занимает всего около 200 МБ памяти. В чем дело? Есть ли у меня другие варианты того, как загрузить этот словарь в Python или хотя бы скомпилировать его в байтовый код. Я запускаю моделирование на C ++ и не могу писать файлы в любом нужном мне формате. Есть ли там какие-нибудь варианты (библиотеки python и т. Д.)? Я взаимодействую с некоторым программным обеспечением, которому нужны эти данные в качестве словаря, поэтому, пожалуйста, никаких других предложений в этой области. Также на всякий случай, если вам интересно, я определил словарь в текстовом файле, как в приведенном выше определении, так и так,

d = {}
d[1,2,3] = (1,2,3,4)
d[2,5,6] = (4,2,3,4,5,6)
...

Оба дают одинаковый всплеск памяти при компиляции в байтовый код. На самом деле второй кажется немного хуже, что меня удивляет. Должен быть способ уменьшить объем оперативной памяти, необходимый для начальной компиляции. Кажется, что он каким-то образом должен иметь возможность компилировать по одной паре ключ-значение за раз. Есть идеи?

Прочая информация: с использованием python 2.6.5

9
задан GHH 29 July 2011 в 23:38
поделиться