我目前正在开发一个读取大约 50000 行文本文件的应用程序。对于每一行,我需要检查它是否包含特定的字符串。
目前,我使用传统的 System.IO.StreamReader
逐行读取我的文件。
问题是文本文件的大小每次都会改变。我做了几个测试性能,我注意到当文件大小增加时,读取一行将花费更多时间。
例如:
读取包含 5000 行的 txt 文件:0:40
读取包含 10000 行的 txt 文件:2:54
读取 2 倍大的文件需要 4 倍的时间。我无法想象阅读一个 100000 行的文件需要多少时间。
这是我的代码:
using (StreamReader streamReader = new StreamReader(this.MyPath))
{
while (streamReader.Peek() > 0)
{
string line = streamReader.ReadLine();
if (line.Contains(Resources.Constants.SpecificString)
{
// Do some action with the string.
}
}
}
有没有办法避免这种情况:更大的文件 = 更多的时间来阅读一行?
最佳答案
试试这个:
var toSearch = Resources.Constants.SpecificString;
foreach (var str in File.ReadLines(MyPath).Where(s => s.Contains(toSearch))) {
// Do some action with the string
}
这避免了通过在循环之前缓存值来在每次迭代中访问资源。如果这没有帮助,请尝试根据高级字符串搜索算法编写您自己的 Contains
,例如 KMP .
注意:一定要使用File.ReadLines它懒惰地读取行(不像看起来相似的 File.ReadAllLines
一次读取所有行)。
关于c# - 逐行读取一个大文本文件并搜索一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16105856/