concat two byte 返回System.OutOfMemoryException

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

我用这个代码:

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

任何人都可以帮助我

因为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()快得多,快得多。

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

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

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

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

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