【问题标题】:.NET. Minimize memory usage / optimize class design。网。最小化内存使用/优化类设计
【发布时间】:2010-07-19 14:26:50
【问题描述】:

我有下一个类,它实例化了大约 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。因此,所有数据都经过哈希和排序,并且几乎在对服务的每个请求中都使用了此类中的每个字段。可能这里设计的不好,但设计在这里不是问题,我现在无法从头开始重新设计。

【问题讨论】:

  • 你真的需要在内存中保存 4000 万个项目吗?为什么不只保留数据库并使用 sql 来处理它们?
  • 已经在数据库之后了:)
  • 4000 万条你在数据库里做不到的记录你在做什么?
  • 听起来有人需要学习如何使用流。

标签: .net optimization memory


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    简单的答案:根本不使用类。

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2011-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-07
          • 2019-07-20
          • 1970-01-01
          • 2020-01-16
          相关资源
          最近更新 更多