【问题标题】:Out of Memory error on Nested loop C#嵌套循环 C# 上的内存不足错误
【发布时间】:2013-03-01 07:30:02
【问题描述】:

我查了一下,我几乎明白了,但我还有一个剩余的运行时错误。
我的代码如下:

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 是做什么的?你的文件有多大?
  • 我的文件很小,只有 15 kb。它只有 50 行半冒号分隔的东西。代码运行,它像卡住一样挂起。

标签: c# while-loop streamreader


【解决方案1】:

我猜GetWord 并没有让读者进步——导致datalinestream 变得庞大。

或者你的文件真的很大。

出于兴趣 - 你为什么要扔掉line? - 肯定包含您在内部循环中尝试阅读的所有文本?

更新

你的代码中肯定有一个逻辑漏洞,我猜它要么是在你的列表中添加-10 字符,要么是GetWord 中的内部字符串(顺便说一下,使用@987654327 @ 以这种方式在字符串上使用对于性能和内存使用来说是可怕的)。也可能是您的线路终止符不是\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 破解每个单词,在此过程中修剪它们以消除它们可能具有的任何尾随/前导空格。

【讨论】:

  • 是的 - 但如果 GetWord() 不推进它,那么 !='\r' 检查会将代码保留在内部循环中。
  • 我明白你在说什么。没有什么能阻止内部 while 条件为真。
  • 我认为 getword 确实可以正常工作,因为我确实将信息输入到程序中。休息是行不通的。所以我必须在导入后重新启动程序才能拾取。
  • 已更新我的答案 - 我认为您可以更简单(更高效)地实现您想要的。
  • 发布的代码让我陷入了第一行数据的无限循环中。编译器也抱怨 word = word.Trim();因为它是每个命令的变量。
【解决方案2】:

这可能会导致异常

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

【讨论】:

  • 代码运行良好,只是无法退出外部 while 循环。我能够从文件中读取所有数据。当到达文件末尾并最终在 45 秒的挂起中射出运行时错误时,我需要一种中断方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多