为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
芜湖不芜 2019-09-02 16:17:15
我有一个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++;    }}
查看完整描述

3 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

如果您使用的是.NET 4.0,请尝试使用 MemoryMappedFile,它是此方案的设计类。

你可以使用StreamReader.ReadLine否则。


查看完整回答
反对 回复 2019-09-02
?
撒科打诨

TA贡献1934条经验 获得超2个赞

使用StreamReader可能是一种方法,因为您不希望一次将整个文件放在内存中。MemoryMappedFile比随机读取更适合随机访问(顺序读取速度快10倍,内存映射速度是随机访问速度的十倍)。


您也可以尝试从FileOptions设置为SequentialScan的文件流中创建您的streamreader(请参阅FileOptions枚举),但我怀疑它会产生很大的不同。


但是,有一些方法可以使您的示例更有效,因为您在与阅读相同的循环中进行格式化。你正在浪费时钟周期,所以如果你想要更高的性能,那么使用多线程异步解决方案会更好,其中一个线程读取数据而另一个线程在可用时对其进行格式化。Checkout BlockingColletion可能符合您的需求:


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


如果你想要尽可能快的性能,根据我的经验,唯一的方法是顺序读入一大块二进制数据并将其反序列化为文本并行,但代码在这一点上开始变得复杂。


查看完整回答
反对 回复 2019-09-02
?
米脂

TA贡献1836条经验 获得超3个赞

您可以使用LINQ:


int result = File.ReadLines(filePath).Count(line => line.StartsWith(word));

File.ReadLines返回一个IEnumerable <String>,懒惰地从文件中读取每一行而不将整个文件加载到内存中。


Enumerable.Count计算以单词开头的行。


如果从UI线程调用此方法,请使用BackgroundWorker。


查看完整回答
反对 回复 2019-09-02
  • 3 回答
  • 0 关注
  • 520 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信