首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在.NET中读取一个大(1 GB)的txt文件?

如何在.NET中读取一个大(1 GB)的txt文件?
EN

Stack Overflow用户
提问于 2010-11-25 12:21:59
回答 8查看 86.9K关注 0票数 60

我有一个1 GB的文本文件,我需要逐行阅读。执行此操作的最佳和最快方法是什么?

代码语言:javascript
复制
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()中,我检查行的起始字,它必须与一个字匹配,并在此基础上递增一个整数变量。

代码语言:javascript
复制
void FormatData(string line)
{
    if (line.StartWith(word))
    {
        globalIntVariable++;
    }
}
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-11-25 12:29:31

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

否则,您可以使用StreamReader.ReadLine

票数 52
EN

Stack Overflow用户

发布于 2010-11-25 13:36:59

使用StreamReader可能是解决这个问题的方法,因为您不想一次在内存中存储整个文件。MemoryMappedFile更适合随机访问,而不是顺序读取(顺序读取的速度是顺序读取的十倍,内存映射的速度是随机访问的十倍)。

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

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

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

票数 31
EN

Stack Overflow用户

发布于 2010-11-26 22:25:45

您可以使用LINQ

代码语言:javascript
复制
int result = File.ReadLines(filePath).Count(line => line.StartsWith(word));

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

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

如果从UI线程调用,请使用BackgroundWorker

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4273699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档