搜索大量非常大 (50GB+) 的 txt 文件以进行文本匹配

Searching numerous very large (50GB+) txt files for text matching

我不确定应该如何处理这些大文件。我有许多 50GB 以上的文件需要搜索和文本匹配。显然我不能将整个文件加载到内存中(或者至少我的计算机不能)所以我将如何加载这些文件并进行搜索。

我猜我会将部分文件加载到内存中,然后搜索并保存我的结果,然后加载下一部分并最终移动到下一个 50GB 以上的文件并跟踪我的结果,但我不确定究竟如何处理这个。有任何想法吗?我应该用于内存管理和字符串管理的特定函数?

我想用 C# 来做,我把它作为工作项目来做,但我也想尽可能多地学习,所以我想编写代码而不是将它加载到大型数据库和搜索。

速度也是一个问题。

假设您有新行,那么使用具有良好缓冲区大小就足够简单了FileStreams 等有一个内部缓冲区,内部机制会在需要时从磁盘读取它,允许您读取整个文件而不 运行 进入基本的 .net 数组大小限制或将大文件分配到内存中。

请注意,无论如何,超过 85k 的任何内容最终都会出现在您的 大对象堆 中,因此您可能需要以某种方式注意大小。

using var sr = new StreamReader(
   new FileStream("SomeFileName",
      FileMode.Open, 
      FileAccess.Read,
      FileShare.None,
      1024 * 1024,// some nasty buffer size that you have benchmarked for your system
      FileOptions.SequentialScan)); 

while (!sr.EndOfStream)
{
   if (sr.ReadLine().Contains("bob"))
      return true;
}

注意事项:缓冲区大小将是此处性能的关键,SSD 可以比旧的 spindal crayon hdds 更大。确定合适的尺寸需要进行基准测试