C#中小类的内存优化
我有一段代码将大字符串矩阵转换为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? 非常感谢您的时间! 编辑:多一点上下文 – MyClass的矩阵是从字符串矩阵创建的,用于分析.字符串矩阵通过普通网络连接从文本文件中拉出,因此将任务拆分为较小的块并不理想. 解决方法
截至目前,假设您的所有属性都是由实例变量实现的,并且您在64位机器上运行,MyClass的实例是4B * 4 8B = 24B.
此外,由于您使用的是类(引用类型),因此MyClass的矩阵每个单元的权重将进一步增加8B.这意味着您每个单元使用32B.然后,一个10Mx20的MyClass矩阵使用大约6.4GB(这些大小,你必须使用64位二进制),它可能不止于此,因为我忽略了内存对齐要求. 如果从类切换到结构(值类型),矩阵将直接存储MyClass实例,而不是指向MyClass实例的指针.因此,您将为每个实例保存8B. 如果您进一步调整实例变量,使用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的代码是透明的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |