加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#中小类的内存优化

发布时间:2020-12-16 01:56:32 所属栏目:百科 来源:网络整理
导读:我有一段代码将大字符串矩阵转换为MyClass的大矩阵. MyClass是我写的一个小类,它存储了关于每个字符串的一些信息,如下所示: class MyClass{ public MyEnum Class { get; private set; } public int A { get; private set; } public int B { get; private se
我有一段代码将大字符串矩阵转换为MyClass的大矩阵. MyClass是我写的一个小类,它存储了关于每个字符串的一些信息,如下所示:

class MyClass
{
    public MyEnum Class { get; private set; }

    public int A { get; private set; }
    public int B { get; private set; }
    public int C { get; private set; }
    public int D { get; private set; }
}

目前该软件能够处理大至5-20列×100万行的矩阵,但我想将行数增加到接近1000万.我不相信我可以做很多事情来减少字符串矩阵的占用空间,但我想减少MyClass的内存占用.

我可以使用short作为列A的类型,使用byte作为B,C和D的类型,尽管这需要相当大的代码重构.

我的问题,或者说是问题:

>是否值得重构代码以使用short和byte?
>我还应该将MyEnum重构为字节类型吗?
>我还能做些什么来提高课程效率吗?

非常感谢您的时间!

编辑:多一点上下文 – MyClass的矩阵是从字符串矩阵创建的,用于分析.字符串矩阵通过普通网络连接从文本文件中拉出,因此将任务拆分为较小的块并不理想.

解决方法

截至目前,假设您的所有属性都是由实例变量实现的,并且您在64位机器上运行,MyClass的实例是4B * 4 8B = 24B.
此外,由于您使用的是类(引用类型),因此MyClass的矩阵每个单元的权重将进一步增加8B.这意味着您每个单元使用32B.然后,一个10Mx20的MyClass矩阵使用大约6.4GB(这些大小,你必须使用64位二进制),它可能不止于此,因为我忽略了内存对齐要求.

如果从类切换到结构(值类型),矩阵将直接存储MyClass实例,而不是指向MyClass实例的指针.因此,您将为每个实例保存8B.
现在,内存使用率降至4.8GB.

如果您进一步调整实例变量,使用1个短3个字节,并将枚举转换为字节,则每个实例仅使用6B.因此,总内存使用量将降至1.2GB.

无论如何,它将不止于此,因为托管环境在每个对象中存储了一些其他元数据,并且因为内存对齐需要填充对象以获得更快的访问时间.

PS:您实际上不需要更改属性的返回类型.您可以封装类型更改,并在MyClass的实现中执行强制类型转换,如:

struct MyClass
{
  private short a; //Also consider ushort,if you need it
  //...

  public int A
  {
    get { return a; //Automatic promotion }
    private set
    {
      a = (short) value;
      System.Diagnostics.Debug.Assert(a == value,"Integer overflow");
    }
  }

  //...
}

这样,优化对使用MyClass的代码是透明的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读