如何在.NET中读取大型(1GB)txt文件?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (9)

我有一个1 GB的文本文件,我需要逐行阅读。什么是最好和最快的方式来做到这一点?

private void ReadTxtFile()
{            
    string filePath = string.Empty;
    filePath = openFileDialog1.FileName;
    if (string.IsNullOrEmpty(filePath))
    {
        using (StreamReader sr = new StreamReader(filePath))
        {
            String line;
            while ((line = sr.ReadLine()) != null)
            {
                FormatData(line);                        
            }
        }
    }
}

FormatData()我检查必须与一个单词匹配的行的起始字,并根据该增量一个整数变量。

void FormatData(string line)
{
    if (line.StartWith(word))
    {
        globalIntVariable++;
    }
}
提问于
用户回答回答于

如果使用的是.NET 4.0,请尝试使用 MemoryMappedFile,这是此场景的设计类。

你可以使用StreamReader.ReadLine其他方式。

用户回答回答于

使用StreamReader可能是一种方法,因为不希望将整个文件一次存储在内存中。MemoryMappedFile比顺序读取更适合随机存取(对于顺序读取而言,其速度是其十倍,存储器映射的速度是随机存取速度的十倍)。

也可以尝试使用FileOptions设置为SequentialScan(请参阅FileOptions Enumeration)从文件流创建流式读取器,但我怀疑它会产生很大的差异。

然而,有些方法可以让你的例子更有效率,因为你可以像阅读一样在循环中进行格式化。你在浪费时钟周期,所以如果你想要更多的性能,那么多线程异步解决方案会更好,一个线程读取数据,另一个线程在可用时将其格式化。Checkout BlockingColletion可能适合您的需求:

阻止收集和生产者 - 消费者问题

如果希望获得最快的性能,按照我的经验,唯一的方法是依次读入一大块二进制数据并将其反序列化为文本,但代码在此时开始变得复杂。

扫码关注云+社区