【发布时间】:2020-08-04 05:45:03
【问题描述】:
所以我正在寻找一种方法来有效地搜索文件中的文本。现在我正在使用这个:
using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, 1024 * 1024, FileOptions.SequentialScan))
using (StreamReader streamReader = new StreamReader(fileStream))
{
string line;
while ((line = streamReader.ReadLine()) != null)
{
int index = 0;
while ((index = line.IndexOf(searchText, index, StringComparison.Ordinal)) != -1)
{
index += searchText.Length;
}
}
}
但是,我想知道是否有一种方法可以更有效地搜索文件。我正在考虑可能在缓冲区中搜索文本,但我不确定如何。 谢谢。
编辑: 如果不调用 IndexOf,我会得到大约 1600 毫秒。加上索引,大约是 7400ms。
编辑: 我有一个基本的块读取实现,它把时间缩短到了 740 毫秒。 (没有阅读线) 它还有很多工作要做,但我基本上一次读取一大块并获取索引。
【问题讨论】:
-
这取决于瓶颈是什么,如果是文件读取,那么除了调整缓冲区大小之外,您不会变得更快。
-
this answer 有帮助吗?
-
@TheGeneral 我增加索引,因为我想找到该字符串中的所有匹配项。
-
内存映射文件与否,您的文件读取可能会比实际搜索慢(如果我猜的话)
-
@VS-ux,你不会在这里得到答案,即使有人能想出一个好的答案,它可能会更快或更慢,具体取决于读取的特定文件,以及你是否想按行(和其他考虑)做到这一点。还有一些变量,例如您的 cpu 速度和 hdd 速度,它们将在等式中起作用。如果我是你(我相信你有能力),只要继续标杆,你就会找到最适合你的解决方案。 (注意,我删除了大部分 cmets,因为这已经失控了)