我有一个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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在FormatData()
我检查线必须以一个字相匹配,并基于该增量的整数变量的起始字.
void FormatData(string line)
{
if (line.StartWith(word))
{
globalIntVariable++;
}
}
Run Code Online (Sandbox Code Playgroud)
Tal*_*ner 48
如果您使用的是.NET 4.0,请尝试使用 MemoryMappedFile,它是此方案的设计类.
你可以使用StreamReader.ReadLine
否则.
Hom*_*mde 31
使用StreamReader可能是一种方法,因为您不希望一次将整个文件放在内存中.MemoryMappedFile比随机读取更适合随机访问(顺序读取速度快10倍,内存映射速度是随机访问速度的十倍).
您也可以尝试从FileOptions设置为SequentialScan的文件流中创建您的streamreader(请参阅FileOptions枚举),但我怀疑它会产生很大的不同.
但是,有一些方法可以使您的示例更有效,因为您在与阅读相同的循环中进行格式化.你正在浪费时钟周期,所以如果你想要更高的性能,那么使用多线程异步解决方案会更好,其中一个线程读取数据而另一个线程在可用时对其进行格式化.Checkout BlockingColletion可能符合您的需求:
如果你想要尽可能快的性能,根据我的经验,唯一的方法是顺序读入一大块二进制数据并将其反序列化为文本并行,但代码在这一点上开始变得复杂.
dtb*_*dtb 15
您可以使用LINQ:
int result = File.ReadLines(filePath).Count(line => line.StartsWith(word));
Run Code Online (Sandbox Code Playgroud)
File.ReadLines返回一个IEnumerable <String>,懒惰地从文件中读取每一行而不将整个文件加载到内存中.
Enumerable.Count计算以单词开头的行.
如果从UI线程调用此方法,请使用BackgroundWorker.
StreamReader.ReadLine
应该工作正常.让框架选择的缓冲,除非你知道通过剖析你可以做的更好.
归档时间: |
|
查看次数: |
77048 次 |
最近记录: |