2012-08-07 41 views
-1

我正在編寫解析大型非可預測文件的程序。這部分沒有問題。我一直在使用下面的代碼,循環ReadLine直到文檔結束,以保持內存佔用低。我的問題是一個OutOfMemoryException當一條線太長了。C#讀取塊執行

System.IO.StreamReader casereader = new System.IO.StreamReader(dumplocation); 
string line; 
while ((line = casereader.ReadLine()) != null) 
{ 
    foreach (Match m in linkParser.Matches(line)) 
    { 
     Console.Write(displaytext); 
     Console.WriteLine(m.Value); 
     XMLWrite.Start(m.Value, displaytext, dumplocation, line); 
    } 
} 

XMLWrite只是寫我的正則表達式匹配功能以XML文檔的任何字符串。正則表達式函數是一個簡單的電子郵件搜索。這個問題發生在ReadLine被調用時,應用程序在我正在讀取的文件中發現一條非常長的行(我可以看到這是因爲任務管理器中的內存使用率隨着它填充字符串'行'而攀升並攀升)。最終它耗盡內存並崩潰。我想要做的是讀取預定義的塊(例如8,000個字符),然後通過相同的過程一次運行這些塊。這意味着我將總是知道字符串行的長度(8,000個字符),並且不應該接收和內存不足異常。我的邏輯看起來是邏輯的嗎?我正在尋找實現ReadBlock的最佳方式,因爲目前我無法使其工作。

任何幫助非常感謝!

+1

問題是你仍*失去內存?如果不是,你的問題是什麼?您意味着第一個代碼塊有OOM問題,並且讀取預定義的塊會修復該問題。 – 2012-08-07 15:42:04

+0

發生了什麼?錯誤? – 2012-08-07 15:42:14

+0

你會得到什麼錯誤?你有什麼問題?我沒有在Visual Studio中嘗試你的代碼,但邏輯看起來不錯......編譯器是在抱怨嗎? – 2012-08-07 15:42:28

回答

1

您可以使用此代碼嘗試

  using (StreamReader sr = new StreamReader(yourPath)) 
      { 
       //This is an arbitrary size for this example. 
       char[] c = null; 

       while (sr.Peek() >= 0) 
       { 
        c = new char[5];//Read block of 5 characters 
        sr.Read(c, 0, c.Length); 
        Console.WriteLine(c); //print block 
       } 
      } 

鏈接:http://msdn.microsoft.com/en-us/library/9kstw824.aspx

+0

遇到這個例子,但沒有任何運氣實現它。無論如何謝謝 – 2012-08-07 16:06:44

+0

我很高興爲您效勞 – 2012-08-07 16:54:48

+0

@BenCollins努力工作。那個簡單的例子失敗了? – Paparazzi 2012-08-07 22:01:59

1

線= buffer.ToString(); 這種說法應該是怪罪。緩衝區是一個char數組,它的ToString()方法只返回System.char []。

-1

使用:line = new string(buffer); 而不是