快速搜索已排序的5 GB文件中的行

问题描述

我必须确定在排序的文本文件中是否存在给定的行(作为字符串)。该文件上的数据每天都会更改,平均有1.52亿条记录,文件重约5GB。该文件按字母顺序排列,并且记录用新行分隔。

示例:打招呼

文件
苹果
香蕉
猫猫

你好

我不需要搜索整个文件。找到确切的名称后,它可以返回字符串或整数。只是为了证明它的存在。

我尝试了以下操作:

using (var sr = new StreamReader(txtFile))
{
   string line;
   while ((line = sr.ReadLine()) != null)
   {
       if (line == searchedWord)
           return true;
   }
   return false;
}
int result = File.ReadLines(txtFile).Count(line => line.Equals(searchedWord));
if (result > 0)
   return true;
return false;

我的问题是:有找到更好的解决方案的线了吗?

解决方法

我已经测试了这段代码:

pip install pyqt5

它会在12秒内找到一个字符串,该字符串位于5 GB文件的末尾。如果您的程序需要一整天的时间来执行此操作,建议您不要从486上旋转的锈蚀磁盘上读取数据,而应该购买50美元的SSD和像样的CPU并在该硬件上处理文件。

您需要分析缓慢的来源,还需要显示一些实际数字。您是否正在从网络共享中读取内容,并且程序需要花费多长时间?

您可以执行一些技巧来读取适合您文件系统大小的文件块,并行处理这些文件块(并考虑其中一个文件块可能包含针的开始,而下一个文件块可能包含针的开始)等等,但请注意,要使框架的磁盘访问尽可能高效,需要进行大量工作。

不要比框架聪明,在合适的硬件上运行代码。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...