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整个文件需要地址空间中相同的连续区域,因此它不会解决任何问题。 此答案将被删除。
上述就是C#学习教程:concat two byte 返回System.OutOfMemoryException分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1031928.html