2012-03-14 54 views
8

Like GuyFawkes,我想使用MemoryStream來存儲大量的數據,但仍然遇到'內存不足'異常。
TomTom的答案是我想要做的 - 使用不需要連續塊的實現 - 但是我想知道是否已經有一個免費的實現可用,以幫助我自己寫一個?是否有不使用連續內存的開源MemoryStream實現?

有誰知道一個好的,免費的重新實現MemoryStream,可以處理大流?

編輯:

的MemoryMappedFile解決方案是非常有趣的,我會記住它用於其他項目,但是作爲亨克說,它迷路太遠從MemoryStream的的目標是抽象。具體而言,要求已知能力。
替換者應該處理的數據在某些情況下會非常大,但在其他情況下相對較小(並且我們不知道哪些數據會被刪除,直到其太晚;));此外,該課程的許多實例將同時存在。 最終,使用MemoryMappedFiles所需的工作(爲每個人確定合適的大小)將等同於實施TomTom解決方案的工作。

+4

在StringBuilder的一個類似的問題被改變的方案中使用的繩索固定在.NET 4。谷歌搜索「記憶流繩索」只是產生了一個結尾的程序員的命中。一個64位操作系統是一百美元的解決方案。 – 2012-03-14 19:44:24

+0

好吧,我已經採取了缺乏(酒吧埃裏克和dtb的有趣,但不是我所需要的)作爲一個'不',所以自己實現它的答案。它不是特別複雜,但如果有人可以建議最好的地方,我會上傳它? – sebf 2012-03-15 13:56:30

+0

@HansPassant,繩索是一個有趣的閱讀,謝謝(即使谷歌搜索「記憶繩索」並不完全啓發!)對於我的項目,雖然我只需要數百兆字節的數據流,所以我的實現中的簡單列表就夠了。 – sebf 2012-03-15 13:59:13

回答

0

不完全重新實現MemoryStream,但考慮是否可以使用Memory Mapped File滿足您的要求。

內存映射文件可以解決大內存緩衝區可以解決的很多類問題,效率非常高,並且直接由.NET支持。

+0

但並不總是擅長模仿流。 – 2012-03-14 17:40:38

+0

AFAIK內存映射文件必須具有固定大小。 – Qwertie 2012-03-14 18:02:38

+0

你確定嗎?我相當確信內存映射文件在進程中需要連續的虛擬地址空間塊。他們不能幫助解決這個問題。 – 2012-03-18 17:46:43

1

如果沒有文件,即生存在系統內存中的文件,您將創建一個MemoryMappedFileDelayAllocatePages選項會延遲分配,直到實際需要內存爲止。不過,您需要提前指定最大容量。使用CreateViewStream Method創建一個流。

+0

謝謝你和Eric;我試圖實現MemoryMappedFile解決方案,但它不太適合這種情況(但我已經添加了額外的細節來解釋問題)。 – sebf 2012-03-14 18:48:34

+0

這是否仍然需要完全相同數量的連續虛擬地址空間在您的過程中,因此不能解決問題? – 2012-03-18 17:45:35