2010-04-19 13 views
7

Digamos que hay una variable dict que crece muy grande durante el tiempo de ejecución, hasta millones de pares clave: valor.Uso de RAM variable grande de Python

¿Esta variable se almacena en la memoria RAM, utilizando de manera efectiva toda la memoria disponible y ralentizando el resto del sistema?

Pedir al intérprete que muestre todo el dict es una mala idea, pero ¿estaría bien siempre que se acceda a una tecla a la vez?

Respuesta

8

Sí, el dict se almacenará en la memoria de proceso. Entonces, si se vuelve lo suficientemente grande como para que no haya suficiente espacio en la RAM del sistema, entonces puede esperar ver una desaceleración masiva a medida que el sistema comienza a intercambiar memoria hacia y desde el disco.

Otros han dicho que unos pocos millones de artículos no deberían ser un problema; No estoy muy seguro. La sobrecarga dict misma (antes de contar la memoria tomada por las claves y valores) es significativa. Para Python 2.6 o posterior, sys.getsizeof brinda información útil acerca de la cantidad de RAM que ocupan varias estructuras de Python. Algunos resultados rápidos, de Python 2.6 en una máquina OS X de 64 bits:

>>> from sys import getsizeof 
>>> getsizeof(dict((n, 0) for n in range(5462)))/5462. 
144.03368729403149 
>>> getsizeof(dict((n, 0) for n in range(5461)))/5461. 
36.053470060428495 

Así la sobrecarga dict varía entre 36 bytes por artículo y 144 bytes por artículo en esta máquina (el valor exacto en función de cómo completo el la tabla hash interna del diccionario es: aquí 5461 = 2 ** 14 // 3 es uno de los umbrales donde la tabla hash interna está ampliada).Y eso es antes de agregar la sobrecarga para los ítems dict mismos; si todas son cadenas cortas (digamos, 6 caracteres o menos), eso aún agrega otro> = 80 bytes por elemento (posiblemente menos si muchas claves diferentes comparten el mismo valor).

Así que no necesitaría que muchos millones de elementos dict para extraer RAM en una máquina típica.

+0

gracias, aprendí sobre getsizeof de esto. Prácticamente solo trataré con ~ 15k valores como máximo, y la velocidad es esencial. Estoy usando un dict simplemente porque no he tocado las bases de datos, ¿pero supongo que un DB que lea y escriba desde un disco duro sería más lento que leer/escribir en un dict? – PPTim

+0

Está bien, por un tamaño de ese tipo no deberías tener ningún problema. ¿Cuáles son los tipos de claves y valores? ¿Instrumentos de cuerda? –

+0

en su mayoría carrozas, algunas cuerdas, algunas listas – PPTim

4

Sí, una Python dict se almacena en la RAM. Sin embargo, unos pocos millones de claves no son un problema para las computadoras modernas. Si necesita más y más datos y la RAM se está agotando, considere usar una base de datos real. Las opciones incluyen una base de datos relacional como SQLite (incorporada en Python, por cierto) o un almacén de clave-valor como Redis.

Tiene poco sentido mostrar millones de elementos en el intérprete, pero el acceso a un solo elemento debe ser aún muy eficiente.

+0

¿Qué pasa con bsddb? – tstenner

1

Por lo que sé, Python usa los mejores algoritmos hash, por lo que es probable que obtenga la mejor eficacia y rendimiento de la memoria posible. Ahora, si todo está guardado en la RAM o en un archivo de intercambio depende de su sistema operativo y depende de la cantidad de RAM que tenga. Lo que yo diría que es mejor si a modo de prueba:

from random import randint 
a = {} 
for i in xrange(10*10**6): 
    a[i] = i 

cómo es esto buscando cuando se ejecuta? Toma alrededor de 350Mb en mi sistema, que debería ser manejable por decir lo menos.

+0

el comp que estoy atrapado en este momento tiene 512 mb de ram, por lo que estoy preocupado. sin embargo, la mayoría de las teclas que tendré son de 10k, así que no creo que sea un problema. Gracias por la prueba, aunque no probaría eso en este caso. – PPTim

+0

La mayoría de los sistemas operativos son bastante inteligentes para administrar la memoria y el intercambio. Realmente debería estar bien con un diccionario de cualquier tamaño, siempre que tenga espacio en el disco duro para el archivo de intercambio. – ktdrv

+0

Supongo que falta un factor aleatorio en ese fragmento, posiblemente la clave del diccionario. – Kylotan

5

La principal preocupación con los millones de elementos no es el diccionario en sí mismo, sino cuánto espacio ocupa cada uno de estos elementos. Aún así, a menos que estés haciendo algo extraño, probablemente deberían estar en forma.

Si tiene un diccionario con millones de claves, sin embargo, probablemente esté haciendo algo mal. Usted debe hacer una o ambas:

  1. averiguar qué estructura de datos en realidad se debe utilizar, ya que una sola dict probablemente no es la respuesta correcta. Exactamente lo que esto sería depende de lo que estás haciendo.

  2. Utilice una base de datos. Tu Python debería venir con un módulo sqlite3, así que eso es un comienzo.

Cuestiones relacionadas