嵌套循环C#上出现内存不足错误

时间:2013-03-13 11:29:08

标签: c# while-loop streamreader

我看了这个,我几乎得到了它,但我有一个剩余的运行时错误 我的代码如下:

while ((line = reader.ReadLine()) != null)
{
    while (reader.Peek() != '\r')
    {
        datalinestream.Add(GetWord(reader));
    }
    LuceneDB.AddUpdateLuceneIndex(new MATS_Doc( datalinestream));
    datalinestream.Clear();
}

代码正在导入数据但循环不会中断,并且会因以下内容而崩溃

  

“发生了'System.OutOfMemoryException'类型的未处理异常   在mscorlib.dll“

外部while循环的适当中断条件是什么,以确保我读取整个文件并在结束时中断。我很难解决这个问题,因为我需要前进到下一行,我需要跳过电子表格中的第一行。任何帮助非常感谢。

*的 更新 *

我清除了字符串列表,因为我正在为lucene索引创建一个doc,它只有大约14个字段,我不希望列表变得太大。

我的getword代码

private string GetWord(TextReader inputdata)
        {
            String word = "";

            while (inputdata.Peek() >= 0)
            {
                word += (char)inputdata.Read();
                if ((word.Contains(";"))) break;
            }

        return word;
    }

2 个答案:

答案 0 :(得分:6)

我猜GetWord并没有推动读者 - 导致datalinestream变得庞大。

或者你的档案非常庞大。

出于兴趣 - 你为什么要扔掉line? - 当然包含你在内循环上尝试阅读的所有文本?

<强>更新

代码中某处肯定存在逻辑漏洞,我的猜测是要么将-10个字符添加到列表中,要么添加GetWord中的内部字符串(按顺便说一下,以这种方式对字符串使用+=对于性能和内存使用来说是可怕的。也可能是您的行终结符不是\r而是'裸'\n

那就是说,你可以像这样解决所有问题:

string line = reader.ReadLine();
string wordTemp;
while(line != null)
{
  string[] words = 
    line.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
  foreach(var word in words)
  {
    wordTemp = word.Trim(); //get rid of any whitespace
    if(wordTemp.Length != 0)
      datalinestream.Add(wordTemp);
  }
  LuceneDB.AddUpdateLuceneIndex(new MATS_Doc( datalinestream));
  datalinestream.Clear();
  line = reader.ReadLine();
}

正如我所说的 - 不要丢掉你刚读过的那条线 - 使用它,利用它也剥离换行的事实。然后简单地使用string.Split来破解每个单词,在过程中修剪它们以消除它们可能具有的任何尾随/前导空格。

答案 1 :(得分:1)

这可能会导致异常

     while (reader.Peek() != '\r')
      {
       datalinestream.Add(GetWord(reader));
      }