|
|
1
2
当您调整数组的大小时,它将创建一个新的数组来保存新的数据,然后复制到数据上,同时在内存中有两个相同数据的副本。如你所料。
使用结构时,数组将占用
同样的情况也适用于随着时间推移而增大的列表,因此用预期的项目数初始化它是明智的,以避免调整大小和复制。 如您所知,在32位系统上,您将在大约800MB的内存中命中。您可以尝试的一种解决方案是将结构放到磁盘上,并在需要时读取它们。因为它们是固定大小的,所以您可以很容易地跳到文件的正确位置。 我有一个项目 Codeplex 用于处理大量数据。它有一种可能自动增长的数组类型,如果您再次在内存中保存它时遇到问题,这可能会帮助您的场景。 |
|
|
2
3
关于数组存储方式的假设是正确的。从结构改为类会给每个实例增加一点开销,并且您将失去位置的优势,因为所有数据都必须通过引用收集,但是正如您观察到的,它现在可以解决内存问题。 |
|
3
2
您遇到的问题可能是由于大型对象堆的碎片而不是正常的内存不足情况(所有内存都已耗尽)。 见 http://msdn.microsoft.com/en-us/magazine/cc534993.aspx 该解决方案可能与通过大的固定增量而不是小的随机增量来增加数组一样简单,这样当数组被释放时,LOH内存块可以重新用于新的大数组。 这也可以解释结构->类问题,因为结构可能存储在数组本身中,而类将是小对象堆中的小对象。 |
|
|
4
0
.NET框架4.5.1能够在垃圾收集期间显式压缩大型对象堆(LOH)。
|