鉴于本文 http://www.simple-talk.com/dotnet/.net-framework/object-overhead-the-hidden-.net-memory--allocation-cost/,我想知道人们在内存中使用数组存储数据字段而不是实例化数百万个对象并增加内存开销(例如,每个对象 12-24 字节,取决于您阅读的文章)。每个属性的数据因项目而异,因此我不能使用严格的享元模式,但会设想类似的东西。
我对这种表示的想法是,有一个“模板对象”......
class Thing
{
double A;
double B;
int C;
string D;
}
然后是一个容器对象,具有根据请求创建对象的方法......
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;
}
}
因此,这是一种简单的策略,但用途不是很广泛,例如,如果不复制数据并破坏数组字段存储的目的,就无法创建“事物”的子集(作为列表)。我一直无法找到好的例子,所以我希望有做过这种情况的人提供更好的方法来处理这种情况的链接或代码片段......或者更好的想法。
这取决于你的具体场景。根据创建对象的频率,您可以:
如果对象是可序列化的,则将它们保存在 MemoryMappedFile 中(获得中/低性能和低内存消耗的某种融合)。
在不同对象之间映射字段:我的意思是,如果对象最初有默认值,则将它们全部放在单独的基中,并且如果该值与默认值不同,则真正分配一个新空间。 (这对于引用类型自然是有意义的)。
另一个解决方案再次将对象保存到 Sqlite 库。比内存映射文件更容易管理,因为您可以使用简单的 SQL。
选择取决于您,因为这取决于您的具体项目要求。
Regards.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)