1

我正在编写一个解析大型、不可预测的文件的程序。这部分没有问题。我一直在使用下面的代码,循环读取 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 只是将任何与我的正则表达式函数匹配的字符串写入 XML 文档。Regex 函数是一个简单的电子邮件搜索。当调用 ReadLine 并且应用程序在我正在阅读的文件中发现一个非常长的行时会出现问题(我可以看到这是因为任务管理器中的内存使用量在填充字符串“line”时不断攀升)。最终它会耗尽内存并崩溃。我想要做的是读取预定义的块(例如 8,000 个字符),然后通过相同的过程一次运行这些块。这意味着我将始终知道字符串行的长度(8,000 个字符)并且不应该接收和内存不足异常。我的逻辑看起来合乎逻辑吗!?我正在寻找实现 ReadBlock 的最佳方法,因为目前我无法让它工作。

非常感谢任何帮助!

4

3 回答 3

1

line = buffer.ToString(); 这种说法应该受到指责。buffer 是一个 char 数组,它的 ToString() 方法只返回 System.char[]。

于 2012-08-07T15:53:41.440 回答
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
                }
            }

链接:http: //msdn.microsoft.com/en-us/library/9kstw824.aspx

于 2012-08-07T15:45:53.250 回答
-1

使用: line= new string(buffer); 反而

于 2016-08-21T21:12:36.837 回答