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

时间:2013-01-08 08:12:16

标签: c#

我必须阅读一个大文本文件并使用C#逐行解析它。对于小型文件,可以使用StreamReader轻松完成,但在处理大型文件时会出现内存不足的问题。如何使其适应大文件?

以下代码捕获OutOfMemoryException

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

4 个答案:

答案 0 :(得分:10)

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

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

只是让它更干净,但做同样的事情。所以有两种选择:

  1. 一条或多条“线”简直是
  2. “做点什么”这句话慢慢地(或很快)吃掉你的记忆
  3. 我希望后者更有可能。

答案 1 :(得分:1)

我不确定这个,但试试这类.net框架

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

答案 2 :(得分:0)

using (var inputFile = new System.IO.StreamReader(sourceFilePath))
{
    while (inputFile.Peek() >= 0) {
        string lineData = inputFile.ReadLine();

        // Do something with lineData
    }
}

答案 3 :(得分:0)

如何指定缓冲区大小?

像这样。

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

}