使用数组字段而不是大量的对象

Wol*_*ade 7 c# memory storage field object

根据这篇文章,我想知道人们使用数组存储大量数据集(比如说> 10,000,000个对象)来存储数据字段而不是实例化数百万个对象并增加内存开销(例如,12-每个对象24个字节,具体取决于您阅读的文章).每个属性的数据因项目而异,因此我不能使用严格的Flyweight模式,但可以设想类似的东西.

我对这种表示的想法是,有一个'模板对象'......

class Thing
{
  double A;
  double B;
  int    C;
  string D;
}
Run Code Online (Sandbox Code Playgroud)

然后是一个容器对象,其中包含一个根据请求创建对象的方法...

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

所以这是一个简单的策略,但不是非常通用,例如,不能创建'Thing'的子集(作为List)而不重复数据并且无法实现阵列字段存储的目的.我一直无法找到好的例子,所以我会欣赏更好的方法的链接或代码片段来处理这个场景的人,或者是一个更好的想法.

Tig*_*ran 5

这取决于你的具体情况.取决于您创建对象的频率,您可以:

  1. 如果对象是可序列化的,请将它们保存在MemoryMappedFile中(获得一些中/低性能和低内存消耗的融合).

  2. 映射不同对象之间的字段:我的意思是如果对象最初具有默认值,则将它们全部放在单独的基础中,并且如果该值与默认值不同,则实际分配新空间.(这自然适用于参考类型).

  3. 另一个解决方案再次将对象保存到SqlLite基础.比MemoryMappedFiles更容易管理,因为您可以使用简单的SQL.

选择取决于您,因为它取决于您的具体项目需求.

问候.


csh*_*net 5

根据这篇文章,我想知道人们使用数组存储大量数据集(比如说> 10,000,000个对象)来存储数据字段而不是实例化数百万个对象并增加内存开销的经验是什么...

我想有几种方法可以解决这个问题,实际上你正在寻找一种可能的解决方案来限制内存中的数据.但是,我不确定你的结构是否会减少到24?bytes会给你带来很多好处.你的结构大约是79个字节(15个字符串)= 8 + 8 + 4 + 24?+ 4 + 1 +(2*字符长度),因此您的总收益最多为25%.这似乎没有用,因为你必须处于1000万*80字节适合内存而1000万*100字节不适合的位置.这意味着你要设计一个处于灾难边缘的解决方案,太多的大字符串,或太多的记录,或其他程序占用内存,你的机器内存不足.

如果你需要支持n个小记录的随机访问,其中n = 1000万,那么你应该设计至少2n或10n.也许你已经考虑过你的1000万了?无论哪种方式,都有很多技术可以支持这种类型的数据被访问.

一种可能性是,如果字符串限制在最大长度(ml),合理的大小(比如255),那么你可以去一个简单的ISAM商店.每条记录将是8 + 8 + 4 + 255字节,您可以简单地偏移到平面文件中读取它们.如果记录大小可变或可能很大,那么您将需要使用不同的存储格式并将偏移存储到文件中.

另一种可能性是,如果您通过某个键查找值,那么我会推荐类似嵌入式数据库或BTree的东西,您可以禁用某些磁盘一致性以获得性能.碰巧我为大量数据的客户端缓存编写了一个BPlusTree.有关使用B +树的详细信息,请点击此处.