2011-05-09 73 views
13

我有一個需要閱讀從1gb原始文本文件從磁盤到RAM在C#中做一些字符串操作。C#非常大的字符串操作(內存不足異常)

string contents = File.ReadAllText(path) 

拋出內存異常(不出所料)

什麼是去了解這一點的最好方式嗎?

+4

什麼樣的字符串操作?在任何特定時間只閱讀一些部分是否可行? – 2011-05-09 22:10:55

+0

理論上是的,但工作瓦特/遺產代碼,我知道這將被使用的環境,它會更容易閱讀一次去。 – 2011-05-09 22:12:55

+0

我假設你在PC上有足夠的可用RAM,你正在嘗試使用這個RAM。我知道修改遺留代碼可能是一件痛苦的事情(如果它的任務至關重要,那麼可怕也是可怕的),但是您可能需要考慮一次只閱讀一個塊並以這種方式處理它。 – 2011-05-09 22:19:55

回答

12

可能嘗試也看看使用memory-mapped file

+0

從文檔看來,您會使用「MemoryMappedViewStream」,然後拉入一些字節塊。如有必要,請使用'Encoding.GetString' [http://msdn.microsoft.com/en-us/library/05cts4c3.aspx]。 – Dave 2011-05-13 14:25:07

0

如果別人建議的解決方案不工作,我建議你設置字符的限制閱讀,閱讀文本按部分。一旦你緩存了一部分文本,你就可以操縱它。

如果需要在任何方向操縱它(我的意思是,不從左至右在一個步驟),你總是可以實現在節點:)

一個B-Tree和存儲部件的文本有時,按順序閱讀文本幾乎是不可能的,這裏就是B-Tree的幫助。我大約一年前爲了學術目的(微型數據庫管理器)實現了它,但我認爲應該在C#中實現它。當然,你將不得不實現如何從文件加載BTree的節點。

7

如果你真的想這樣做在內存中這個巨大的字符串操作,那麼你是不是運氣不好了,只要你能滿足下列要求

  1. 編譯針對64位
  2. 在x64系統上
  3. 運行
  4. 目標.NET 4.5

這將解除您面臨的所有內存限制。您的進程內存將僅受計算機內存的限制,並且從.NET 4.5 for x64開始的單個.NET對象上不存在2GiB限制。

0

我對109 MB文件使用ReadAllText,並且內存越來越奇怪。無論如何,所以我使用緩衝區來讀取性能良好的文件,並使用StringBuilder來提高內存的效率。 這是我的代碼:

   StringBuilder sb = new StringBuilder(); 
       using (FileStream fs = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
       using (BufferedStream bs = new BufferedStream(fs)) 
       using (StreamReader sr = new StreamReader(bs)) 
       { 
        string line;      
        while ((line = sr.ReadLine()) != null) 
         sb.AppendLine(line); 
       }