Utilizando campos de matriz en lugar de una gran cantidad de objetos

A la luz deEste artícul, Me pregunto cuáles son las experiencias de las personas con el almacenamiento de conjuntos de datos masivos (por ejemplo,> 10,000,000 de objetos) en la memoria usando matrices para almacenar campos de datos en lugar de crear instancias de millones de objetos y acumular la sobrecarga de la memoria (por ejemplo, 12-24 bytes por objeto , según el artículo que leas). Los datos por propiedad varían de un artículo a otro, por lo que no puedo usar un patrón de Flyweight estricto, pero imagino algo similar.

Mi idea de este tipo de representación es que uno tiene un 'objeto de plantilla' ...

class Thing
{
  double A;
  double B;
  int    C;
  string D;
}

Y luego un objeto contenedor con un método para crear un objeto a pedido ...

class ContainerOfThings
{
  double[] ContainerA;
  double[] ContainerB;
  int[]    ContainerC;
  string[] ContainerD;

  ContainerOfThings(int total)
  {
    //create arrays
  }

  IThing GetThingAtPosition(int position)
  {
     IThing thing = new Thing(); //probably best done as a factory instead
     thing.A = ContainerA[position];
     thing.B = ContainerB[position];
     thing.C = ContainerC[position];
     thing.D = ContainerD[position];

     return thing;
  }
}

Así que es una estrategia simple pero no muy versátil, por ejemplo, uno no puede crear un subconjunto (como una Lista) de 'Cosa' sin duplicar datos y derrotar el propósito del almacenamiento de campo de matriz. No he podido encontrar buenos ejemplos, por lo que agradecería enlaces o fragmentos de código de mejores formas de manejar este escenario de alguien que lo haya hecho ... o una mejor idea.

Respuestas a la pregunta(8)

Su respuesta a la pregunta