concat two byte []返回System.OutOfMemoryException

MaR*_*RiO 3 c#

我有concat两个字节[]的问题.其中一个有超过300,000,000字节.它抛出了类型的异常System.OutOfMemoryException.

我用这个代码:

byte[] b3 = by2.Concat(by1).ToArray();
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我

Mar*_*zek 7

由于Concat调用不ToArray知道结果数组有多大.它无法创建正确的大数组,只需填充数据即可.所以它会创建一个小的,然后当它完全创建一个大小两倍的新的,等等,只要有更多的数据要填充.这样你需要更多的内存,然后才是理论上的(b1.Length + b2.Length) * 2.事情变得更加棘手,因为在某些点之后这些大数组被分配在LOH上,并且不像GC那样容易收集到普通对象.

这就是为什么你不应该ToArray()在这种情况下使用它并采用传统的方式:分配大小等于组合源数组大小的新数组并复制数据.

就像是:

var b3 = new byte[b1.Length + b2.Length];
Array.Copy(b1, b2, b1.Length);
Array.Copy(b1, 0, b2, b1.Length, b2.Length);
Run Code Online (Sandbox Code Playgroud)

它不保证成功,但更有可能.并执行更多,更快,更快ToArray().