2013-04-18 76 views
0

後,我想讀一個文件,該代碼,但經過682次我得到這個錯誤:出的存儲器中讀取讀取682 txt文件

Exception of type 'System.OutOfMemoryException' was thrown.

System.IO.StreamReader file = new System.IO.StreamReader(scanpad[lusteller]); 

scanpad與文件路徑和lusteller是一個數組反它。 Scanpad感染11207個文件。

我也看過恩沒有對地方682文件

任何一個解決方案嗎?

這裏完整版我的代碼

 using (StreamReader file = new System.IO.StreamReader(scanpad[lusteller])) 
     { 
      //do stuff 

      lengte = bestandsnaam.Length; 
      lengte = lengte - 13; 
      controller = bestandsnaam.Remove(lengte, 13);   // controllertype uit naam halen 
      do 
      { 
       rij = file.ReadLine(); 
       if (rij != null)    //error op volgende lijn vermijden 
       { 
        if (rij.StartsWith("0") || rij.StartsWith("1") || rij.StartsWith("2") || rij.StartsWith("3")) 
        { 
         rijcheck = true; 
        } 

        teller = teller + 1; 
        if (teller > 10) 
        { 
         if (rijcheck == true)   // rij is datumlijn 
         { 
          string[] split = rij.Split(' '); 
          foutinformatie[0, index] = type;      //type ophalen 
          foutinformatie[3, index] = controller;    //controllernaam ophalen 
          foutinformatie[1, index] = split[0];    //datum ophalen 
          foutinformatie[2, index] = split[1];    //tijd ophalen 
          foutinformatie[4, index] = split[2];    //foutcode ophalen 
          foutinformatie[5, index] = split[5];    //foutteller ophalen 
          if (controller.StartsWith("MPU") == true) 
          { 
           lusarraygraad = 5; 
           while (lusarraygraad < 360) 
           { 

            if (graadmpu[0, lusarraygraad] == split[2]) 
            { 
             try 
             { 
              graad = graadmpu[1, lusarraygraad]; 
              foutinformatie[7, index] = graad; 
             } 
             catch 
             { 
             } 
             lusarraygraad = lusarraygraad + 499; 
             graadgevonden = true; 
            } 
            lusarraygraad = lusarraygraad + 1; 
           } 
           foutinformatie[7, index] = graad; 
           if (graadgevonden == false) 
           { 
            foutinformatie[7, index] = ""; 
           } 
           graadgevonden = false; 
          } 

          ////////////////////////////////////////////////////////////////////////// 
          if (controller.StartsWith("AAUX") == true) 
          { 
           lusarraygraad = 4; 
           while (lusarraygraad < 30) 
           { 

            if (graadaaux[0, lusarraygraad] == split[2]) 
            { 
             try 
             { 
              graad = graadaaux[1, lusarraygraad].ToString(); 
              foutinformatie[7, index] = graad; 
             } 
             catch 
             { 
             } 
             lusarraygraad = lusarraygraad + 499; 
             graadgevonden = true; 
            } 
            lusarraygraad = lusarraygraad + 1; 
           } 
           foutinformatie[7, index] = graad; 
           if (graadgevonden == false) 
           { 
            foutinformatie[7, index] = ""; 
           } 
           graadgevonden = false; 
          } 
          if (controller.StartsWith("ACTRL") == true) 
          { 
           lusarraygraad = 6; 
           while (lusarraygraad < 85) 
           { 

            if (graadactrl[0, lusarraygraad] == split[2]) 
            { 
             try 
             { 
              graad = graadactrl[1, lusarraygraad].ToString(); 
              foutinformatie[7, index] = graad; 
             } 
             catch 
             { 
             } 
             lusarraygraad = lusarraygraad + 499; 
             graadgevonden = true; 
            } 
            lusarraygraad = lusarraygraad + 1; 
           } 
           foutinformatie[7, index] = graad; 
           if (graadgevonden == false) 
           { 
            foutinformatie[7, index] = ""; 
           } 
           graadgevonden = false; 
          } 

          try 
          { 
           telleromschrijving = 6; 
           informatie = ""; 
           while (split[telleromschrijving] != " ") 
           { 
            informatie = informatie + " " + split[telleromschrijving]; 
            telleromschrijving = telleromschrijving + 1; 
           } 
          } 
          catch 
          { 
           foutinformatie[6, index] = informatie;    //foutteller ophalen 
          } 
          rijcheck = false; 
          rij = file.ReadLine(); 
          while (varcheck < 40) 
          { 
           // rij met eerste variable 

           if (rij != "") 
           { 
            variable[indexlokaal, varteller] = rij; 
            foutinformatie[varteller + 8, index] = variable[indexlokaal, varteller] = rij; 
            varteller = varteller + 1; 
            rij = file.ReadLine(); 
           } 
           else 
           { 
            foutinformatie[varteller + 8, index] = " "; 

            varteller = varteller + 1; 
           } 
           varcheck = varcheck + 1; 
          } 
          varcheck = 0; 
          varteller = 0; 
          indexlokaal = indexlokaal + 1; 
          index = index + 1; 
         } 
        } 
       } 
      } 
      while (rij != null); 
      file.Close(); 
      file.Dispose(); 
     } 
+2

聽起來像你不使用'使用' – Sayse 2013-04-18 07:03:59

+0

你是否同時工作的流? – 2013-04-18 07:04:12

+1

你能發佈更多你正在使用的代碼,例如你正在使用的循環嗎? – 2013-04-18 07:05:08

回答

0

嘗試使用Using:(讀後配置內存)

using(System.IO.StreamReader file = new System.IO.StreamReader(scanpad[lusteller])) 
     { 

     } 
3

我想象682僅僅是一個數字,你碰巧被耗盡內存,而不是一個特殊的數字。你應該封裝你的StreamReader到

using(StreamReader file = new System.IO.StreamReader(scanpad[lusteller])) 
{ 
//do stuff 
} 

這樣,你的StreamReader正在使用後被丟棄,清除內存

EDIT FOR UPDATE

裏面你的StreamReader你也有

     rij = file.ReadLine(); 
         while (varcheck < 40) 
         { 
          // rij met eerste variable 

          if (rij != "") 
          { 
           variable[indexlokaal, varteller] = rij; 
           foutinformatie[varteller + 8, index] = variable[indexlokaal, varteller] = rij; 
           varteller = varteller + 1; 
           rij = file.ReadLine(); 
          } 

但您不檢查ReadLine是否再次返回空值,查找處的G http://msdn.microsoft.com/en-GB/library/system.io.streamreader.readline.aspx

這也可能會導致內存溢出的異常,因爲您的流已經達到零。可是你還繼續起

+0

OK謝謝,我會嘗試 – user2282583 2013-04-18 07:06:09

+0

這給了我同樣的問題 – user2282583 2013-04-18 07:28:01

+0

編輯你的問題,顯示的更新...(或許更多有關如何使用這條線了!) – Sayse 2013-04-18 07:29:06

1

這一切都取決於你使用的StreamReader做什麼。

首先你需要處理它,但我不認爲這是GC在內存耗盡之前收集它的問題(除非你也持有對它的引用)。

如果您使用類似於「ReadToEnd」的內容並且文件內容很大,您可以使用創建的字符串(如果通過創建子字符串來操縱它們可能會變得更糟)來打大對象堆。 過了一段時間堆會變得碎片化,因此無法爲您的請求找到足夠大的內存塊。

那麼,這是我的猜測,你的代碼很少有信息,祝你好運。

+0

+ 1ed爲讀取結束,我不相信這是問題,因爲我無法想象任何人想讀11207不同大小的文件,所以我認爲他們都是個別但同樣大小的文件 – Sayse 2013-04-18 07:26:18

+0

也許他是掃描數據文件插入數據到數據庫,或類似的文件搜索..有很多情況下,坦率地掃描完全相同大小的11K文件似乎不太可能:) – Arthur 2013-04-18 07:30:05

+0

我正在掃描文件,把它們放在一個SQL數據庫。但我必須有txt文件的每一行 – user2282583 2013-04-18 07:40:57