2011-05-07 24 views
5

He estado trabajando en un proyecto que implica cargar un diccionario relativamente grande en la memoria de un archivo. El diccionario tiene poco menos de 2 millones de entradas, cada entrada (clave y valor combinados) tiene menos de 20 bytes. El tamaño del archivo en el disco es de 38 MB.Uso de la memoria del diccionario Python

Mi problema es que cuando intento cargar el diccionario, mi programa se expande inmediatamente a más de 2.5 gigabytes de memoria utilizada.

Este es el código que utilizo para leer el diccionario desde el disco:

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

¿Has probado [pickle] (http://docs.python.org/library/pickle.html)? – MattH

+0

¿Cuáles son los tipos de la clave y el valor? –

Respuesta

7

Creo que la memoria se utiliza para analizar la sintaxis de AST diccionario.

Para este tipo de uso, es mucho mejor si utiliza el módulo cPickle en lugar de usar 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 al descargar mediante el uso reciente protocolo que es más eficiente pero posiblemente no compatible con versiones anteriores de pitón. Si esta es una buena idea o no, depende de por qué necesita volcar/cargar.

+0

es posible que también desee utilizar el módulo json –

+0

El estante también es una buena alternativa. Está diseñado para grandes diccionarios que pueden estar parcialmente almacenados en el disco. – Nathan

+0

Gracias! No he tenido la oportunidad de implementar esto todavía, pero leí un poco el pickle; parece que eso debería solucionar el problema. – dckrooney

0

Esto puede ser un poco fuera de tema, pero también puede ayudar tremendamente usando expresiones de generador cuando se trabaja con grandes archivos/flujos de datos.

This discussion explains it very well y this presentation cambiaron la forma en que escribía mis programas.

Cuestiones relacionadas