我有一个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++;
}
}
发布于 2010-11-25 12:29:31
如果您使用的是.NET 4.0,请尝试MemoryMappedFile,它是为此场景设计的类。
否则,您可以使用StreamReader.ReadLine
。
发布于 2010-11-25 13:36:59
使用StreamReader可能是解决这个问题的方法,因为您不想一次在内存中存储整个文件。MemoryMappedFile更适合随机访问,而不是顺序读取(顺序读取的速度是顺序读取的十倍,内存映射的速度是随机访问的十倍)。
您也可以尝试从FileOptions设置为SequentialScan (请参阅)的文件流中创建streamreader,但我怀疑这是否会有很大的不同。
然而,有一些方法可以使您的示例更有效,因为您在与阅读相同的循环中进行格式化。您正在浪费时钟周期,所以如果您想要更高的性能,使用多线程异步解决方案会更好,在多线程异步解决方案中,一个线程读取数据,另一个线程在数据可用时格式化数据。检出可能符合您需求的BlockingColletion:
如果您想要尽可能快的性能,根据我的经验,唯一的方法是按顺序读入同样大的二进制数据块,并并行地将其反序列化为文本,但在这一点上,代码开始变得复杂。
发布于 2010-11-26 22:25:45
您可以使用LINQ
int result = File.ReadLines(filePath).Count(line => line.StartsWith(word));
File.ReadLines返回一个IEnumerable,它懒惰地从文件中读取每一行,而不将整个文件加载到内存中。
Enumerable.Count计算以单词开头的行数。
如果从UI线程调用,请使用BackgroundWorker。
https://stackoverflow.com/questions/4273699
复制相似问题