我正在编写一个解析大型不可预测文件的程序。这部分没问题。我一直在使用下面的代码,循环读取ReadLine直到文档结束,以保持较低的内存占用。当一条线太长时,我的问题是OutOfMemoryException
。
System.IO.StreamReader casereader = new System.IO.StreamReader(dumplocation);
string line;
while ((line = casereader.ReadLine()) != null)
{
foreach (Match m in linkParser.Matches(line))
{
Console.Write(displaytext);
Console.WriteLine(m.Value);
XMLWrite.Start(m.Value, displaytext, dumplocation, line);
}
}
XMLWrite只是将与我的Regex函数匹配的任何字符串写入XML文档。正则表达式功能是一个简单的电子邮件搜索。当调用ReadLine并且应用程序在我正在阅读的文件中找到一个非常长的行时会出现问题(我可以看到这是因为任务管理器中的内存使用量在填充字符串'line'时爬升和爬升)。最终它耗尽了内存和崩溃。我想要做的是读取预定义的块(例如8,000个字符),然后通过相同的过程一次运行这些块。这意味着我将始终知道字符串行的长度(8,000个字符),并且不应该接收和内存不足异常。我的逻辑看起来是逻辑吗??我正在寻找实现ReadBlock的最佳方法,因为目前我无法使其正常工作。
非常感谢任何帮助!
答案 0 :(得分:1)
您可以尝试使用此代码
using (StreamReader sr = new StreamReader(yourPath))
{
//This is an arbitrary size for this example.
char[] c = null;
while (sr.Peek() >= 0)
{
c = new char[5];//Read block of 5 characters
sr.Read(c, 0, c.Length);
Console.WriteLine(c); //print block
}
}
答案 1 :(得分:1)
line = buffer.ToString(); 这个说法应该是罪魁祸首。 buffer是一个char数组,它的ToString()方法只返回System.char []。
答案 2 :(得分:-1)
使用:line = new string(buffer); 代替