Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 读取大型文件时出现错误_C#_Out Of Memory_Readline_Large Files - Fatal编程技术网

C# 读取大型文件时出现错误

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.

我有一台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行

    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在创建后不久就这样做了-如果您错过了,很抱歉。