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

本文关键字:非常 和解 平面文件 读取 线程 | 更新日期: 2023-09-27 17:51:01

我必须阅读一个大的文本文件,并使用c#逐行解析它。对于小文件,StreamReader可以很容易地完成,但在处理大文件时,它会捕获内存不足异常。我如何使它适应大文件?

以下代码捕获OutOfMemoryException:

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

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

这几乎是懒惰行阅读器的标准代码,除非有一些真的大单行,否则不应该引起OutOfMemoryException。你也可以试试:

foreach(var line in File.ReadLines(FileNameWithPath)) {
    // Do something here...
}

只是使它更干净,但做同样的事情。所以有两个选项:

  1. 一个或多个"行"只是巨大的
  2. "在这里做点什么"中的东西正在慢慢(或迅速)吞噬你的记忆

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

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

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))
{
    .....
}