Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.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# - Fatal编程技术网

如何使用C#中的线程读取和解析非常大的平面文件?

如何使用C#中的线程读取和解析非常大的平面文件?,c#,C#,我必须读取一个大的文本文件,并使用C#逐行解析它。对于小文件,可以使用StreamReader轻松完成,但在处理大文件时遇到内存不足异常。如何使其适应大文件 以下代码捕获了OutOfMemoryException using (StreamReader reader = new StreamReader(FileNameWithPath)) { while ((line = reader.ReadLine()) != null) { // Do something

我必须读取一个大的文本文件,并使用C#逐行解析它。对于小文件,可以使用
StreamReader
轻松完成,但在处理大文件时遇到内存不足异常。如何使其适应大文件

以下代码捕获了OutOfMemoryException

using (StreamReader reader = new StreamReader(FileNameWithPath))
{
    while ((line = reader.ReadLine()) != null)
    {
        // Do something here...
    }
}

这几乎是惰性行读取器的标准代码,并且不应该导致
OutOfMemoryException
,除非有一些真正的大单行。您也可以尝试:

foreach(var line in File.ReadLines(FileNameWithPath)) {
    // Do something here...
}
这只是使它更干净,但做同样的事情。因此有两种选择:

  • 一条或多条“线”非常大
  • “在这里做点什么”中的某些东西正在慢慢(或很快)吞噬你的记忆

  • 我希望后者更像。

    我不确定这一点,但尝试一下这类.net框架


    -内存映射文件将文件内容映射到应用程序的逻辑地址空间。内存映射文件使程序员能够处理非常大的文件,因为内存可以并发管理,并且它们允许完全、随机地访问文件,而无需搜索。内存映射文件也可以跨多个进程共享。

    指定缓冲区大小如何

    using (var inputFile = new System.IO.StreamReader(sourceFilePath))
    {
        while (inputFile.Peek() >= 0) {
            string lineData = inputFile.ReadLine();
    
            // Do something with lineData
        }
    }
    
    像这样

    using (var reader = new StreamWriter(path,false,Encoding.UTF8, 1000))
    {
        .....
    
    }
    

    哪一行捕获异常?这个代码对我来说很好。例外似乎来自“在这里做点什么…”-那么你到底在做什么(请写一些代码)?意识到你完全歪曲了事实。导致内存不足异常的不是流读取器,也不是读取,而是我们没有看到的代码“//在这里做点什么”。当然,除非一行中有数百兆字节。我同意//在这里做点什么…,这可能是个问题,但也要注意,如果您使用的是.Net 4或更高版本,您可以使用File.ReadLines()获取可以与foreach一起使用的字符串枚举器。虽然这是真的,但是
    StreamReader
    似乎完全适合所描述的情况。@MarcGravel-同意你的观点,但我几周前刚刚读过关于这个类的内容……但我没有尝试过,但这可能会有帮助……该检查在语义上与问题代码中的
    null
    检查相同