搜索大量非常大 (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 更大。确定合适的尺寸需要进行基准测试
我不确定应该如何处理这些大文件。我有许多 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 更大。确定合适的尺寸需要进行基准测试