嵌套循环中的内存不足错误C#
我看了这个,我几乎得到它,但我有这一个剩余的运行时错误。
我的代码如下:嵌套循环中的内存不足错误C#
while ((line = reader.ReadLine()) != null)
{
while (reader.Peek() != '\r')
{
datalinestream.Add(GetWord(reader));
}
LuceneDB.AddUpdateLuceneIndex(new MATS_Doc(datalinestream));
datalinestream.Clear();
}
的代码导入数据,但循环不会打破,将碰撞出由于以下
“未处理的类型系统的”例外。 OutOfMemoryException异常”在mscorlib.dll”
什么是外适当的休息条件,同时循环,以确保我读了整个文件,并在年底突破发生 。由于我需要前进到下一行,因此我需要跳过电子表格中的第一行,因此我很困惑。任何帮助非常感谢。
* UPDATE *
我清楚琴弦,因为我创造了Lucene索引文档的列表,它只有在这约14个领域,我不想要列表太大。导致datalinestream
来获得海量 -
我对朗朗上口
private string GetWord(TextReader inputdata)
{
String word = "";
while (inputdata.Peek() >= 0)
{
word += (char)inputdata.Read();
if ((word.Contains(";"))) break;
}
return word;
}
我猜GetWord
没有进展的读者代码。
或者你的文件真的很大。
出于兴趣 - 你为什么要扔掉line
? - 当然包含你想要在内部循环中读取的所有文本?
更新
必须有显然是一个逻辑洞某处在你的代码,我的猜测是它或者添加-1
或0
字符到您的列表,或在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
即可破解每个单词,在此过程中对它们进行修剪以消除它们可能具有的任何拖尾/前导空格。
是的 - 但如果GetWord()不提前它,那么'!='\ r''检查将保持代码在内部循环中。 – 2013-03-13 11:35:59
我明白你的意思了。没有什么能阻止内在的条件,而不是真的。 – Jodrell 2013-03-13 11:37:27
我认为getword确实能正常工作,因为我确实将信息导入程序。休息不起作用。所以我必须重新启动程序才能在导入后启动。 – TheCodeNovice 2013-03-13 13:48:22
这可能会导致异常
while (reader.Peek() != '\r')
{
datalinestream.Add(GetWord(reader));
}
代码运行良好,它只是无法退出外while循环。我能够读取文件中的所有数据。当到达文件末尾时,我需要一种打破方式,并最终在45秒的挂起时间内发出运行时间错误。 – TheCodeNovice 2013-03-13 13:49:40
是什么'GetWord'吗?你的文件有多大? – 2013-03-13 11:30:26
我的文件非常小15 kb。它只有50行分号分隔的东西。代码运行,它挂起来,就像它以某种方式卡住了。 – TheCodeNovice 2013-03-13 13:42:26