concat two byte []返回System.OutOfMemoryException

时间:2014-02-09 08:33:09

标签: c#

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

我使用此代码:

byte[] b3 = by2.Concat(by1).ToArray();

任何人都可以帮助我

4 个答案:

答案 0 :(得分: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);

它不保证成功,但更有可能。并且执行的速度比ToArray()快得多。

答案 1 :(得分:2)

使用这些数据时,我认为您应该使用流(这当然取决于应用程序)。

然后,您可以拥有适用于数据的代码,而无需将所有代码同时加载到内存中,您可以创建一个专门的流类,充当两个流之间的串联。

答案 2 :(得分:1)

好吧,错误信息是自己的,你没有自由连续~550Mb的RAM。也许它太分散了。

答案 3 :(得分:1)

嗯..你知道,从系统中请求连续阻止~600meg - 我并不感到惊讶。它本身就是一个很大的块,并且你必须在内存中拥有源数组,这是超过1GB的原始数据块。

您应该开始考虑其他数据结构,或尝试将它们保存为文件并将它们映射到内存编辑:memmapping整个文件需要地址空间中相同的连续区域,因此它解决了没有。这个答案将被删除。