我在将大小为 10MB 的字节数组组合到 500MB 的主数组时出现内存不足异常
我用来合并字节数组的方法是:
private byte[] Combine(byte[] mainarray, byte[] newarray)
{
byte[] c = new byte[mainarray.Length + newarray.Length];
System.Buffer.BlockCopy(mainarray, 0, c, 0, mainarray.Length);
System.Buffer.BlockCopy(newarray, 0, c, mainarray.Length, newarray.Length);
newarray = null;
mainarray = null;
return c;
}
知道我哪里出错了吗?
最佳答案
在 32 位应用程序中,您很可能会遇到 OutOfMemoryException,因为您有(如果我理解正确的话)
- 10 MB 的源数组
- 另一个 490 MB 的源数组
- 500 MB 的目标数组
由于数组需要在内存中连续,.NET 必须能够分配一个 500 MB 的大块,这是不太可能的。
我想在调试器中演示这一点,但是 this目前的问题阻止我这样做。 WinDbg 中的命令是 !address -summary
,您需要查找最大的空闲 block 。
基本上它可能看起来像这样:
--- Usage Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
<unclassified> 6007 57a86000 ( 1.370 Gb) 85.37% 68.48%
Free 268 19519000 ( 405.098 Mb) 19.78%
...
--- Largest Region by Usage ----------- Base Address -------- Region Size ----------
<unclassified> 66f0000 c041000 ( 192.254 Mb)
Free 71c97000 4109000 ( 65.035 Mb)
这意味着,有 405 MB 可用空间,但单个 block 中只有 65 MB。
关于合并字节数组时 C# 内存不足异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32848598/