合并字节数组时 C# 内存不足异常

标签 c# arrays

我在将大小为 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/

相关文章:

arrays - 对可变长度项目/算法进行排序

python - 如何在 Python 中用零初始化一个整数 array.array 对象

c# - 计算 for 循环的大致运行时间

c# - 如何在 Visual C# 自动创建代码后重命名表单对象(按钮、文本框等)?

c# - 如何强制 Newtonsoft Json 序列化所有属性? (具有 "Specified"属性的奇怪行为)

php - 在 foreach 中捕获数组的下一个值

c# - 将带有 byte[] 的函数从 C# 转换为 C++

c# - 在 C#6.0 中编码但针对 .NET 2.0 进行编译的缺点

arrays - 将数组保存到 Parse.com

javascript - 排序方法的javascript函数中的value1和value 2是什么