Tengo una serie de archivos de texto de gran tamaño (hasta 1 gig) que se generan a partir de un experimento que debe analizarse en Python. Estarían mejor cargan en una matriz numpy 2D, que presenta la primera pregunta: ¿Creando incrementalmente una matriz numpy y midiendo el uso de la memoria
- Como se sabe al comienzo de la carga del número de filas, ¿cómo puede un arsenal muy grande numpy se construirán de manera más eficiente, ¿fila por fila?
Simplemente agregando la fila a la matriz sería ineficaz en términos de memoria, ya que dos grandes matrices coexistirían momentáneamente. El mismo problema parece ocurrir si usa numpy.append
. Las funciones stack
son prometedoras, pero idealmente querría hacer crecer la matriz en su lugar.
Esto lleva a la segunda pregunta: ¿
- ¿Cuál es la mejor manera de observar el uso de memoria de un programa Python que en gran medida utiliza matrices numpy?
Para estudiar el problema anterior, he utilizado las herramientas habituales de generación de perfiles de memoria (Heapy y Pimpighter) pero obtengo el tamaño de los objetos de la matriz externa (80 bytes) y no los datos que contienen. Aparte de una medición cruda de cuánta memoria está usando el proceso de Python, ¿cómo puedo obtener el tamaño "completo" de las matrices a medida que crecen?
Detalles locales: OSX 10.6, Python 2.6, pero las soluciones generales son bienvenidas.
Gracias a todos. Dado el tamaño del archivo, era reacio a hacer un pase inicial solo para contar las líneas, pero parece ser la forma más fácil y eficiente de resolver el problema de la memoria. –
Hace un tiempo, un compañero de trabajo hizo una pregunta similar, y se me ocurrió otra posibilidad que podría salvarte del pase inicial. Si conoce el tamaño aproximado de un "elemento" en el archivo, puede dividirlo en el tamaño del archivo. Agregue un relleno para mayor seguridad, y luego puede escribir en toda la memoria. Para ocultar el extra, sin inicializar, puede usar una vista de solo los elementos con datos. Deberás asegurarte de que no pases por alto. No es perfecto, pero si las lecturas de sus archivos son lentas y sus datos se presentan de manera consistente, podría funcionar. – AFoglia