。净。最小化内存使用/优化类设计

时间:2010-07-19 14:26:51

标签: .net optimization memory

我有下一个实例化大约4000万次的类,其所有实例占所有进程内存的80%(超过15GB)。

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。因此,对所有数据进行散列和排序,并且此类中的每个字段几乎在每个服务请求中使用。这可能是设计不好的东西,但设计在这里不是问题,我现在无法从头开始重新设计。

4 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:1)

简单回答:根本不要使用课程。

  

实例化大约4000万次   它的所有实例大约占80%   所有进程内存(超过   15GB)。

为什么?听起来你需要一个数据库。有什么特别的原因吗?

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

由于字符串最有可能容纳最大内存量,因此可以尝试字符串实习。