Me preguntaba si alguien podría saber la respuesta a lo siguiente.Serialización de memoria de Python
Estoy usando Python para construir un árbol de sufijos basado en caracteres. Hay más de 11 millones de nodos en el árbol que se ajustan a aproximadamente 3 GB de memoria. Esto se redujo desde 7 GB mediante el método de clase ranura en lugar del método Dict.
Cuando serializo el árbol (usando el protocolo más alto) el archivo resultante es más de cien veces más pequeño.
Cuando vuelvo a cargar el archivo encurtido, vuelve a consumir 3 GB de memoria. ¿De dónde viene esta sobrecarga adicional, es algo relacionado con el manejo por parte de Pythons de las referencias de memoria a instancias de clase?
actualización
Gracias larsmans y Gurgeh para sus muy útiles explicaciones y consejos. Estoy usando el árbol como parte de una interfaz de recuperación de información sobre un corpus de textos.
Originalmente almacené los niños (máximo de 30) como una matriz Numpy, luego probé la versión de hardware (ctypes.py_object*30
), la matriz de Python (ArrayType
), así como el diccionario y los tipos de conjunto.
Las listas parecían funcionar mejor (usando guppy para perfilar la memoria, y __slots__['variable',...]
), pero todavía estoy tratando de aplastarlo un poco más si puedo. El único problema que tuve con las matrices es tener que especificar su tamaño por adelantado, lo que causa un poco de redundancia en términos de nodos con un solo hijo, y tengo bastantes de ellos. ;-)
Después de que se construye el árbol, intento convertirlo en un árbol probabilístico con un segundo pase, pero puedo hacerlo cuando se construye el árbol. Como el tiempo de construcción no es demasiado importante en mi caso, el array.array() suena como algo que sería útil probar, gracias por la sugerencia, realmente apreciada.
Te voy a decir cómo va.
Estoy realmente impresionado con Pickle, e incluso existe la posibilidad de reducir el tamaño del archivo en otro 25% con la función de optimización pickletools. Pickle es increíblemente eficiente. :-) – Martyn