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



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

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索引创建一个文档,它只有大约14个字段,我不希望列表变得太大。

getword

代码
private string GetWord(TextReader inputdata)
        {
            String word = "";
            while (inputdata.Peek() >= 0)
            {
                word += (char)inputdata.Read();
                if ((word.Contains(";"))) break;
            }
        return word;
    }

我猜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来破解每个单词,在此过程中修剪它们,以消除它们可能具有的任何尾随/前导空格。

这可能会导致异常

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

最新更新