Использование памяти словаря Python - PullRequest
5 голосов
/ 08 мая 2011

Я работал над проектом, который включает в себя загрузку относительно большого словаря в память из файла.Словарь содержит чуть менее 2 миллионов записей, каждая запись (ключ и значение в совокупности) не превышает 20 байтов.Размер файла на диске составляет 38 МБ.

Моя проблема в том, что когда я пытаюсь загрузить словарь, моя программа сразу расширяется до более чем 2,5 гигабайт используемой памяти.код, который я использую для чтения словаря с диска:

f = open('someFile.txt', 'r')
rT = eval(f.read())
f.close()

Ответы [ 2 ]

7 голосов
/ 08 мая 2011

Я думаю, что память используется для синтаксического анализа словаря AST.

Для такого использования гораздо лучше, если вы используете модуль cPickle вместо использования repr / eval.

import cPickle

x = {}
for i in xrange(1000000):
    x["k%i" % i] = "v%i" % i
cPickle.dump(x, open("data", "wb"), -1)

x = cPickle.load(open("data", "rb"))

-1, когда дамп означает использование последнего протокола, который более эффективен, но, возможно, не обратно совместим со старыми версиями Python. Если это хорошая идея или нет, зависит от того, почему вам нужно сделать сброс / загрузку.

0 голосов
/ 13 марта 2012

Это может быть немного не по теме, но это также может очень помочь при использовании выражений генератора при работе с большими файлами / потоками данных.

Это обсуждение очень хорошо объясняет и эта презентация изменила способ написания моих программ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...