es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué una lista utiliza casi 3 veces la memoria de un arreglo?

Estoy tratando de agregar una gran cantidad de datos a una lista, pero parece usar mucha más RAM que un array. Me preguntaba por qué y si hay una mejor solución.

Esta solución con un array ocupa alrededor de 78 MB de RAM. Tiene sentido ya que 4 byte * 20000000 ~= 76 MB:

float[] arrayValues = new float[20000000];

for (int i = 0; i < 20000000; i++)
     arrayValues[i] = i;

Pero esta solución con una lista ocupa 206 MB (!!!):

List<float> listValues = new();

for (int i = 0; i < 20000000; i++)
     listValues.Add(i);

¿Cómo puede ser eso? Básicamente está haciendo lo mismo: guardando 20000000 valores flotantes. ¿De dónde viene ese adicional de 128 MB? ¿Hay una mejor manera que no produzca tanta sobrecarga?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una razón por la cual List podría utilizar más memoria que un array es porque está implementado como un array dinámico. Esto significa que tiene que asignar más memoria de la necesaria para acomodar posibles crecimientos en el futuro.

    Además, List tiene cierto sobrecosto debido a su implementación de características como el redimensionamiento, inserción y eliminación de elementos. Esto puede contribuir al aumento del uso de la memoria.

    Una posible solución para reducir el uso de memoria podría ser utilizar una implementación respaldada por arrays, como la clase ArraySegment. Esto le permitiría aprovechar la conveniencia de usar una interfaz List al tiempo que aún puede controlar explícitamente el uso de la memoria.

    Otra opción podría ser considerar el uso de una estructura más especializada para ciertos escenarios, como un HashSet o SortedSet si necesita realizar ciertas operaciones eficientemente. En última instancia, depende de los requisitos y las limitaciones específicas de su aplicación.

Comments are closed.