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.

Un comentario sobre “Arrays vs Dictionaries”

  1. Hola Cristhian, en primer lugar decirte que yo intentaría no trabajar con este volumen de datos y si he de hacerlo intentaría hacerlo desde la propia base de datos, seguramente utilizando otras alternativas, desde un store procedure con un cursor, aunque corres el riesgo de colapsar también el servidor, agrupando estos en una vista, o bajar solo los campos clave para luego procesar registro a registro o trabajar en bloques, exportar los datos a un servidor de base de datos para procesarlos en bloques, es decir buscar otra alternativa, pues difícilmente podrás trabajar en memoria con tal volumen de datos. No tiene lógica.
    El consumo de memoria con tantos datos siempre sera muy alto, esto te dice, que debes intentar trabajar con menos datos, es aconsejable que utilices funciones asíncronas para no colapsar el sistema.

    Un saludo.

    Un saludo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *