2010-07-19 61 views
0

我拥有下一个实例化大约4000万次的类,其所有实例占用全部进程内存(大于15GB)的80%。.NET。最大限度地减少内存使用/优化类设计

class MyClass 
{ 
    String Field1 
    String Field2 
    String Field3 
    int Field4 
    int Field5 
    float Field6 
    SomeEnum Field7 
    Boolean Field8 
    Boolean Field9 
    Boolean Field10 
    Byte Field11 
    Byte Field12 
} 

我想以某种方式来优化这个类,但不知道我能在这种情况下做什么。我想将布尔型字段组合成单个字节或自定义字段对齐,但不确定它是否更糟,以及它是否不会破坏某些内容。还试图将其改为结构,但在现有代码中出现性能问题而没有显着改进。

那么,在没有严重的性能下降的情况下,如何减少内存使用量呢?

此代码将主要在x64服务器上运行,x32仅在开发中运行。

编辑:

这是服务,咋办很快返回取决于所有这些数据的结果。这里的速度非常快,约为20ms-150ms。所以所有的数据都被哈希和排序,并且该类中的每个字段几乎用于对服务的每个请求。可能这里的设计不好,但设计在这里不是问题,我现在无法从头开始重新设计它。

+3

你真的需要在内存上放置4000万个物品吗?为什么不保留数据库并使用sql来处理它们? – Giorgi 2010-07-19 14:31:03

+0

它已经在数据库之后:) – Kamarey 2010-07-19 14:33:27

+1

你在用数据库中无法做到的4000万条记录做什么? – 2010-07-19 14:35:23

回答

1

简单的答案:根本不要使用课堂。

实例约40万次 及其所有情况下采取一切进程的内存(超过 15GB)的约80% 。

用于什么?听起来像你需要一个数据库。任何特定的原因?

5

当然你可以把所有的布尔变成一个字段。将枚举和字节值组合到一个字段中可以节省内存,因为字段通常是对齐的,因此占用更多空间。在.NET中也有控制成员对齐的属性。

但最后你有一个设计问题。最好尝试重新设计你的应用程序。所有的数据值是否真的需要同时进入内存?你可以把不需要的部分放在硬盘上,只有在真正需要时才能检索它?

告诉我们更多关于应用程序的功能,以便我们为您创建一些想法。

1

感觉像一个奇怪的设计,如果我没有错算,15GB/4000万超过400.所以假设只是这个类占据了大部分空间,这似乎表明每个实例使用数百字节。我怀疑通过将3个布尔值更改为一个字节来节省几个字节会好得多。

我假设它是占用大部分空间的字符串,也许你可以将字符串留在数据库中,只在你的类中存储一个ID,然后你可以根据需要查看它们。

1

由于字符串最有可能保存最大的内存量,所以您可以尝试字符串实习。

相关问题