【发布时间】:2010-11-09 09:56:43
【问题描述】:
我有一个问题,几个 3 维数组分配了大量内存,程序有时需要用更大/更小的数组替换它们并抛出 OutOfMemoryException。
示例:分配了 5 个 96MB 数组(200x200x200,每个条目中有 12 个字节的数据),程序需要将它们替换为 210x210x210 (111MB)。它以类似于以下方式执行此操作:
array1 = new Vector3[210,210,210];
其中 array1-array5 与之前使用的字段相同。这应该将旧数组设置为垃圾收集的候选对象,但似乎 GC 动作不够快,并在分配新数组之前留下分配的旧数组 - 这会导致 OOM - 而如果它们在新分配之前被释放,则空间应该是够了。
我正在寻找一种方法来做这样的事情:
GC.Collect(array1) // this would set the reference to null and free the memory
array1 = new Vector3[210,210,210];
我不确定完整的垃圾收集是否是一个好主意,因为该代码可能(在某些情况下)需要相当频繁地执行。
有合适的方法吗?
【问题讨论】:
-
这会导致OOM异常似乎很奇怪。你有一些示例代码来演示这个问题吗?
-
这是一个相当大(仍未发布)的程序的一部分,不幸的是我只能发布实际代码的小sn-ps,没有足够大的可编译。
-
你的问题不是内存管理,而是你使用了太大的数组。为什么你认为你首先需要那些大型阵列?你用它们做什么?
-
程序进行体积渲染,这些数组保留传递给着色器的数据(要渲染的所有体素的位置、颜色和法线) - 我可以通过使用可调整大小的集合来减小大小(这只会保留实际渲染的那些)但这会杀死FPS。我能想到的唯一选择是使用光线投射或类似的东西从头开始重写渲染代码,但在不久的将来我没有时间这样做。
标签: c# arrays garbage-collection xna out-of-memory