在大型文本文件中查找包含特定单词的行的最快方法

本文关键字:单词 方法 包含特 文本 大型 文件 查找 | 更新日期: 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线程。

  1. 获得一个读取速度更快的硬盘驱动器(如果你还没有移动到固态驱动器可能会有很大帮助)。

  2. 将数据存储在不同物理驱动器上的多个文件中。并行搜索这些驱动器

  3. 使用RAID0硬盘配置。(这是前一种方法的特殊情况)

  4. 创建文件中可用于搜索特定单词的行索引。(创建索引将比单个搜索昂贵得多,并且将需要大量磁盘空间,但它将允许以更快的速度进行后续搜索。)