2011-11-22 91 views
2

在c#中OutOfMemoryExcetpion ...我試圖創建一個主要基於BPlus樹的新索引。該指數應該用於海量數據(超過5萬個項目)。爲了使索引更快,我在RAM中保留了內部樹節點(每個節點有大約4KB的信息,256個子節點引用)(它們經常被訪問)。葉子(可變大小)被寫入磁盤,最大200MB的文件。
爲了寫或從文件中讀取數據,我使用了以下內容:在寫入FileStream時在c#中OutOfMemoryException

FileStream _FS = new FileStream(FullPath, FileMode.OpenOrCreate); 
... 
byte[] Data = new byte[size]; 
_FS.Read(Data, 0, size); 
... 
_FS.Write(Data, 0, _BlockSize); 

的問題是,在一個較大的數字插入的項目(19 000 000)我得到的OutOfMemoryException異常。我知道樹的內部結構(內部節點)可能會佔用大量內存,但是,我相信這不是內存滿的原因。

在我使用下面的構造:

_FS = new FileStream(FullPath, FileMode.OpenOrCreate, FileAccess.ReadWrite, 
FileShare.None, 1024, FileOptions.WriteThrough | Settings.FILE_FLAG_NO_BUFFERING); 

的OutOfMemoryException異常不提高(至少不是在20 000 000項),然而,在該項目被插入的速度較小。 我相信,當使用第一個FileStream構造函數時.net使用一些內部緩衝區(在RAM中),這會填充內存並導致引發OutOfMemoryException。

問題是,如何使用FileStream(或其他)爲了能夠高速插入項目(寫入磁盤),並引發OutOfMemoryException?

+1

該異常與流本身無關,您需要顯示代碼的其他部分並解釋如何在內存中存儲/分配樹。 –

+0

這裏'size'的值是什麼? –

+0

也;你提到「項目」 - 它是每個文件的項目?要麼...? (我想看看'Data'分配的頻率) –

回答

2

如果您在第一個示例的循環中放入_FS.Flush(),說每發生10000條記錄,會發生什麼?