在大型文本文件中查找包含特定单词的行的最快方法
本文关键字:单词 方法 包含特 文本 大型 文件 查找 | 更新日期: 2023-09-27 18:18:15
我试图找到一个包含在一个大文本文件(18 MB)内的特定文本的行,目前我使用StreamReader打开文件并逐行检查它是否包含搜索字符串
while ((line = reader.ReadLine()) != null)
{
if (line.Contains("search string"))
{
//Do something with line
}
}
但是不幸的是,因为我使用的文件有超过100万条记录,所以这个方法很慢。实现这一目标的最快方法是什么?
一般来说,这种性质的磁盘IO将会很慢。在性能方面,您可能无法改进当前版本,至少在不显著改变存储数据的格式或硬件的情况下是无法做到的。
但是,您可以缩短代码并在维护和可读性方面简化它:
var lines = File.ReadLines(filename).Where(l => l.Contains("search string"));
foreach(var line in lines)
{
// Do something here with line
}
将整个文件读入内存会导致应用程序挂起并且非常慢,您认为还有其他替代方法吗
如果这里的主要目标是防止应用程序挂起,你可以在后台而不是在UI线程中这样做。如果你让你的方法异步,这可以变成:
while ((line = await reader.ReadLineAsync()) != null)
{
if (line.Contains("search string"))
{
//Do something with line
}
}
这可能会使整个操作花费更长的时间,但不会在文件访问发生时阻塞UI线程。
-
获得一个读取速度更快的硬盘驱动器(如果你还没有移动到固态驱动器可能会有很大帮助)。
-
将数据存储在不同物理驱动器上的多个文件中。并行搜索这些驱动器
-
使用RAID0硬盘配置。(这是前一种方法的特殊情况)
-
创建文件中可用于搜索特定单词的行索引。(创建索引将比单个搜索昂贵得多,并且将需要大量磁盘空间,但它将允许以更快的速度进行后续搜索。)