Arrays vs Dictionaries

Tengo la necesidad de cargar en memoria una tabla con un gran volumen de datos. Hablamos de una tabla de millones de registros. Además la estructura de los datos no es conocida a priori. Los tipos de cada columna y su número se conocen después de ejecutar una consulta a base de datos.

Entonces me surge la duda: Qué sería más óptimo en cuanto al consumo de memoria? ¿Usar Arrays o Diccionarios?

La ventaja principal de los diccionarios es que me permite añadir filas a la tabla sin tener que preocuparme por redimensionar cada vez el array. Además, puedo acceder a los valores de la tabla usando un nombre, en lugar de usar un índice.

image

Para salir de dudas, he hecho una prueba, un poco simplona, pero que me ha sacado de dudas:

Primero, he hecho una carga en memoria de una tabla de 100 columnas y un millón de registros, usando un diccionario y una lista genérica.

image

Al ejecutar esto…

image

Vaya, nisiquiera llega a cargar el millón de registros. Se ha quedado  en 185.000 filas. 

image

A ver qué pasa con los arrays…

Lo mismo, pero con menos registros

image

image

Vuelvo a ejecutar la prueba, para cada una de las opciones, pero esta vez reduciendo el número de columnas a 10.

Esta vez, ambos procesos acaban sin el error de memoria.

El consumo de memoria es en el caso de los arrays es de 916MB

image

En el caso de las listas y diccionarios es de 929MB

image

Lo que sí he notado, pero no he querido entretenerme en comprobarlo, es que en el caso de los arrays el tiempo de ejecución era menor, lo que indica un acceso a memoria más óptimo en el caso de los arrays.

De todos modos me he decantado por usar las listas, pues la prioridad era el consumo de memoria frente al tiempo de proceso.

Hemos visto que el consumo de memoria es el prácticamente el mismo en ambos casos, pero usando los diccionarios, la programación es más cómoda, pudiéndose referenciar columnas por su nombre. Es posible que esto último ayude incluso a reducir el número de errores.