簡體   English   中英

concat two byte []返回System.OutOfMemoryException

[英]concat two byte[] returns System.OutOfMemoryException

我有concat兩個字節[]的問題。 其中一個有超過300,000,000字節。 它拋出System.OutOfMemoryException類型的異常。

我用這個代碼:

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整個文件在地址空間中需要相同的連續區域,因此它不會解決任何問題。 此答案將被刪除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM