Gran uso de RAM variable de Python

Supongamos que hay una variable dict que crece mucho durante el tiempo de ejecución, hasta millones de pares clave: valor.

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

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

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

Otros han dicho que unos pocos millones de artículos no deberían plantear un problema; No estoy muy seguro. La sobrecarga del dict en sí (antes de contar la memoria tomada por las claves y los valores) es significativa. Para Python 2.6 o posterior, sys.getsizeof proporciona información útil sobre la cantidad de RAM que ocupan las distintas 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 

Por lo tanto, la sobrecarga del dict varía entre 36 bytes por elemento y 144 bytes por elemento en esta máquina (el valor exacto depende de qué tan completa esté la tabla hash interna del diccionario; aquí 5461 = 2 ** 14 // 3 es uno de los umbrales donde se encuentra la tabla hash interna es ampliada). Y eso es antes de agregar la sobrecarga para los artículos dict; si todas son cadenas cortas (6 caracteres o menos, por ejemplo), entonces eso agrega otros> = 80 bytes por elemento (posiblemente menos si muchas claves diferentes comparten el mismo valor).

Por lo tanto, no se necesitarían tantos millones de elementos de dictado para agotar la RAM en una máquina típica.

La principal preocupación con los millones de elementos no es el diccionario en sí, sino la cantidad de espacio que ocupa cada uno de estos elementos. Aún así, a menos que estés haciendo algo raro, probablemente deberían encajar.

Sin embargo, si tienes un dictado con millones de teclas, probablemente estés haciendo algo mal. Debes hacer uno o ambos de

  1. Averigüe qué estructura de datos debería utilizar, ya que un solo dictado probablemente no sea 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.

Sí, un dict Python se almacena en la memoria RAM. Sin embargo, unos pocos millones de llaves no son un problema para las computadoras modernas. Si necesita más y más datos y la memoria 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 valores clave como Redis.

No tiene mucho sentido mostrar millones de elementos en el intérprete, pero acceder a un solo elemento debería ser muy eficiente.

Por lo que sé, Python utiliza los mejores algoritmos de hash, por lo que probablemente obtendrá la mejor eficiencia de memoria y rendimiento posibles. Ahora, si todo se guarda en la RAM o se confirma en un archivo de intercambio depende de su sistema operativo y de la cantidad de RAM que tenga. Lo que diría es mejor si lo intentas:

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

¿Cómo se ve esto cuando lo ejecutas? Toma alrededor de 350Mb en mi sistema, que debería ser manejable por decir lo menos.