C# 读取大型文件时出现错误
我有一台32G内存/windows服务器64位的机器 该文件大约为30G,但由于它是一个日志文件,因此不断增长 我得到了一个内存不足的异常(在ReadLine上),但我不明白为什么——因为我只是在反复阅读“line”。在此之后,数据不会被存储 ReadLine是否以我意想不到的方式工作?它是否有效地将整个文件读入内存?或者,这是在等待日志文件增长的同时,反复读取最后一行的结果 将堆栈跟踪编辑为错误: 引发了“System.OutOfMemoryException”类型的异常。 位于System.Text.StringBuilder.ExpandByABlock(Int32 minBlockCharCount) 在System.Text.StringBuilder.Append(Char*value,Int32 valueCount) 在System.Text.StringBuilder.Append(字符[]值,Int32 startIndex,Int32字符计数) 在System.IO.StreamReader.ReadLine()中 在C:\Projects\OrderManager\OrderManager\FIXFileReader.cs中的FIXFileReader.NextIntraMessage(DateTime&sourceDT)中:第116行C# 读取大型文件时出现错误,c#,out-of-memory,readline,large-files,C#,Out Of Memory,Readline,Large Files,我有一台32G内存/windows服务器64位的机器 该文件大约为30G,但由于它是一个日志文件,因此不断增长 我得到了一个内存不足的异常(在ReadLine上),但我不明白为什么——因为我只是在反复阅读“line”。在此之后,数据不会被存储 ReadLine是否以我意想不到的方式工作?它是否有效地将整个文件读入内存?或者,这是在等待日志文件增长的同时,反复读取最后一行的结果 将堆栈跟踪编辑为错误: 引发了“System.OutOfMemoryException”类型的异常。 位于System.
private string line;
private StreamReader;
//edit to give better picture
txtFileReader = new StreamReader(File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite));
while (true)
{
while ((line = txtFileReader.ReadLine()) == null)
{
if (!masterForm.FixFileDataLive)
{
masterForm.FixFileDataLive=true;
}
System.Threading.Thread.Sleep(1);
}
// Do processing of line here
// < other code >>
//
}
私有字符串行;
私有流阅读器;
//编辑以提供更好的图片
txtFileReader=newstreamreader(File.Open(fileName,FileMode.Open,FileAccess.Read,FileShare.ReadWrite));
while(true)
{
而((line=txtFileReader.ReadLine())==null)
{
如果(!masterForm.FixFileDataLive)
{
masterForm.FixFileDataLive=true;
}
系统线程线程睡眠(1);
}
//在这里做生产线的加工
//>
//
}
更新:
在8GB内存的笔记本电脑上测试了10GB文本文件后,以下内容适用于0内存问题。写入该文件使LINQPad使用的RAM不超过65MB。读取文件使用的内存不超过800MB
下面的代码与您的示例非常相似
void Main()
{
using(StreamWriter writer = new StreamWriter("D:\\Test.txt", true))
{
while(true)
{
writer.WriteLine("Test");
}
}
// At some point, stop the writing and comment it out and then re-execute with
// with the reading code below. I ran the above until I had a 10GB text file.
using (TextReader reader = new StreamReader(File.Open("D:\\Test.txt",
FileMode.Open, FileAccess.Read,
FileShare.ReadWrite)))
{
while(true)
{
var line = string.Empty;
while((line = reader.ReadLine()) == null)
{
Console.WriteLine("Waiting....");
Thread.Sleep(500);
}
Console.WriteLine(line);
}
}
}
我不认为你的问题在于阅读文件。没有更多的信息,我们不可能确切地知道问题是什么。请注意,如果您还没有使用实现,并且读取文本文件似乎还可以
以下是原始问题的原始答案
希望这是您粘贴的实际代码,而不是在提出问题时键入的东西。否则这个答案就没用了
您的while
状态错误。你想在有台词要读的时候工作。
您需要!=null
而不是==null
while ((line = txtFileReader.ReadLine()) != null)
如果您以==
的身份离开,您的程序将永远不会实际执行任何操作。当然,除非它无法读取第一行,这将导致无限循环。也许您的内存不足问题是由于代码超出了这一部分
您还应该使用
语句将txtFileReader
包装在中,以便它可以在您完成时正确关闭流。考虑将StreamReader定义替换为C#中的“”命令。而且这个问题可能是重复的。看见同时阅读。您是否尝试过使用File.ReadLines来代替?行的长度是多少?您是否看到内存使用情况确认您确实使用了太多内存?文件中有多少行?如果文件只有一行长,那么readLine将读取整个文件。@DominikAntal我不认为您链接的文章会有帮助-OP已经有了相当于ReadLines
。。。若读取的结果存储在某个地方,第一个可能会提示实际问题出现在一些完全无关的代码中。否-我确实希望==null,这就是我等待文件获取更多数据的地方。我编辑了我的代码,给出了一个更完整的想法。我只能从一个大得多的应用程序中提取一个片段。@ManInMoon现在它显示在另一个主循环中,而循环中,一定要将它包装在using语句中。但是,如果我们不知道它在做什么,当一条线被发现时,我们仍然不能真正帮助你。我所能看到的是,你设置了行,做了一些事情,然后立即再次打开文件。。。。太糟糕了。我不会再打开文件了!它始终保持打开状态,然后我等待向其中添加新数据。@ManInMoon,好吧,现在不是这样,因为您在问题中编辑了代码=PI在创建后不久就这样做了-如果您错过了,很抱歉。