繁体   English   中英

结构vs类内存开销

[英]Struct vs class memory overhead

我正在写一个应用程序,它将创建数千个小对象并将它们递归存储在数组中。 “递归”是指K的每个实例将具有K实例的数组,该数组将具有K实例的数组,依此类推,并且此数组+一个int字段是唯一的属性+一些方法。 我发现即使是少量数据,内存使用量也会快速增长-大约1MB,并且当我正在处理的数据大约10MB时,我会收到“ OutOfMemoryException”,更不用说它更大了(我有4GB的RAM) :)。 那你建议我做什么? 我认为,如果我创建单独的类V来处理那些对象,以便K的实例将仅具有K的数组+一个整数字段,并使K作为结构而不是类,则它应该对内容进行一些优化-没有垃圾收集和东西...但这是一个挑战,所以在开始完全重写之前,我想问一下这是否是一个好主意:)。

编辑:好的,一些抽象代码

public void Add(string word) {
    int i;
    string shorter;

    if (word.Length > 0) {
        i = //something, it's really irrelevant

        if (t[i] == null) {
            t[i] = new MyClass();
        }

        shorterWord = word.Substring(1); 

        //end of word
        if(shorterWord.Length == 0) {
            t[i].WordEnd = END;
        }

        //saving the word letter by letter
        t[i].Add(shorterWord);
        }
    }
}

对我来说,在深入研究时,我有以下假设(它们可能不精确;对于一名程序员,我正在变老)。 一个类有额外的内存消耗,因为需要一个引用来解决它。 存储引用,在32位编译器上需要一个Int32大小的指针。 总是分配在堆上(不记得C ++是否还有其他可能性,我敢冒险吗?)

在本文中找到的简短答案是,对象的基本占用空间为12个字节+ 4个可能未使用的字节,具体取决于您的类(毫无疑问,这与填充有关)。

http://www.codeproject.com/Articles/231120/Reducing-memory-footprint-and-object-instance-size

您将遇到的其他问题是数组也有开销。 一种可能是将自己的偏移量管理到一个或多个更大的数组中。 反过来,这种语言越来越接近一种更有效的语言将更适合的语言。

我不确定是否可以有效地为小对象提供存储的库。 大概是。

我的看法是,使用Structs,在较大的数组中管理自己的偏移量,并根据需要使用正确的打包指令(尽管我怀疑每次处理不均匀打包的数据时,这在运行时都会花费一些额外的指令)

[StructLayout(LayoutKind.Sequential, Pack = 1)]

你的筹码正在炸毁。

迭代而不是递归地执行。

您不会炸毁系统堆栈,而是炸毁代码堆栈,10K函数调用会将其炸掉。

您需要适当的尾部递归,这只是一个迭代技巧。

确保系统中有足够的内存。 超过100mb +等。这实际上取决于您的系统。 链接列表,递归对象就是您正在查看的对象。 如果继续递归,它将达到内存限制,并且将抛出nomemoryexception。 确保跟踪任何程序上的内存使用情况。 没有什么是无限的,尤其是记忆。 如果内存有限,请将其保存到磁盘。

看起来您的代码中存在无限递归并且抛出了内存不足。 检查代码。 递归代码应该有开始和结束。 否则,它将在某个时候超过10 terrabyte的内存。

只需列出您的递归算法并清除变量名即可。 如果您正在执行BFS类型的遍历并将所有对象保留在内存中,则将用光内存。 例如,在这种情况下,将其替换为DFS。

编辑1:

您可以通过估计要生成的项目数然后一次分配那么多的内存来加快算法的速度。 随着算法的进行,填满分配的内存。 这样可以减少碎片和重新分配以及全阵列复制操作。 但是,在对这些生成的单词进行操作之后,应将其从数据结构中删除,以便可以对其进行GC处理,以免耗尽内存。

您可以使用更好的数据结构,即每个字母可以是一个字节(a-0,b-1 ...)。 每个单词片段都可以在索引中也可以在索引中尤其是子字符串-您应该以显着更少的内存摆脱困境(尽管会降低性能)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM