Pregunta

Digamos que hay una variable dict que crece muy grande durante el tiempo de ejecución - hasta en millones de pares clave: valor.

¿Tiene esta variable se almacenan en la memoria RAM, la utilización eficaz de toda la memoria disponible y ralentizar el resto del sistema?

Precio del intérprete para mostrar todo el dict es una mala idea, pero ¿estaría bien, siempre y cuando se accede a una tecla a la vez?

¿Fue útil?

Solución

Sí, el dict será almacenado en la memoria del proceso. Así que si se hace lo suficientemente grande que no hay suficiente espacio en la memoria RAM del sistema, entonces se puede esperar ver desaceleración masiva que el sistema se inicia el intercambio de memoria y de disco.

Otros han dicho que unos pocos millones de artículos no deberían ser un problema; No estoy muy seguro. La propia cabeza dict (antes de contar la memoria ocupada por las claves y valores) es significativo. Para Python 2.6 o posterior, sys.getsizeof da alguna información útil acerca de cómo las diferentes estructuras de Python cantidad de RAM ocupan. Algunos resultados rápidos, desde 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í que el dict varía sobrecarga de entre 36 bytes por elemento y 144 bytes por artículo en esta máquina (el valor exacto dependiendo de lo lleno tabla hash interna del diccionario es, aquí 5461 = 2 ** 14 // 3 es una de las umbrales donde se amplía la tabla hash interna). Y eso es antes de añadir los gastos generales de los artículos dict mismos; si son todas las cadenas cortas (6 caracteres o menos, por ejemplo), entonces que todavía añade otros> = 80 bytes por artículo (posiblemente menos si muchas claves diferentes comparten el mismo valor).

Por lo tanto, no se llevaría a que muchos millones de artículos de diccionario a la memoria RAM de escape en una máquina típica.

Otros consejos

La principal preocupación con los millones de artículos no es el diccionario en sí tanto como la cantidad de espacio de cada uno de estos elementos ocupa. Sin embargo, a menos que estés haciendo algo raro, que probablemente debería ajustarse.

Si usted tiene un diccionario con millones de teclas, sin embargo, es probable que hacer algo mal. Que debe hacer uno o ambos de:

  1. averiguar qué estructura de datos que debe ser hecho usando, porque un solo dict probablemente no es la respuesta correcta. Exactamente lo que esto sería depende de lo que está haciendo.

  2. Usar una base de datos. Su Python debe venir con un módulo del sqlite3, por lo que es un comienzo.

Sí, un dict Python se almacena en la memoria RAM. Unos pocos millones de llaves no es un problema para los ordenadores modernos, sin embargo. Si necesita más y más datos y la memoria RAM se está acabando, considerar el uso de 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 claves-valor, como Redis.

No tiene mucho sentido mostrar millones de artículos en el intérprete, pero el acceso a un solo elemento debe ser todavía muy eficiente.

Por lo que sé Python utiliza los mejores algoritmos hash por lo que probablemente va a obtener la mejor eficiencia de la memoria y el rendimiento posible. Ahora, si todo el asunto se mantiene en la memoria RAM o el compromiso de un archivo de intercambio depende de su sistema operativo y depende de la cantidad de memoria que tiene. Lo que yo diría que es el mejor si a modo de prueba:

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

¿Cómo se busca cuando se ejecuta? Tarda unos 350Mb en mi sistema que debe ser manejable por decir lo menos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top