我的任务是实现一个搜索功能,该功能将搜索几个大型(几 MB)日志文件并返回包含关键字的行。日志文件不断添加到池中,因此每次搜索都必须是动态的。
为每个文件创建一个MemoryMappedFile然后遍历每一行,匹配关键字是否有意义?如果没有,有什么更好的方法来解决它?
任何指向示例代码的链接将不胜感激。
我的任务是实现一个搜索功能,该功能将搜索几个大型(几 MB)日志文件并返回包含关键字的行。日志文件不断添加到池中,因此每次搜索都必须是动态的。
为每个文件创建一个MemoryMappedFile然后遍历每一行,匹配关键字是否有意义?如果没有,有什么更好的方法来解决它?
任何指向示例代码的链接将不胜感激。
为什么不在内存中创建一个结构合理的索引对象树,优化搜索?
编辑:在一些评论后添加...
可能是这样的:
class Index
{
public Dictionary<string, List<SourceFile>> FilesThatContainThisWord {get; set;}
...
}
class SourceFile
{
public string Path {get; set;}
...
}
// Code to look up a term
var filesThatContainMonday = myIndex.FilesThatContainThisWord["Monday"];
是的。“几 MB”并不是很多,它很容易放入 2 GB。
您将需要使用采用映射大小的构造函数,因为文件会随时间增长。另外,我认为您需要在每次搜索时重新创建访问器或流,但我发现 MSDN 在这里有点不清楚。
使用 Stream,创建 StreamReader 并读取每一行是微不足道的。整个过程很可能是 I/O 受限于合理的硬件,所以最初不要为 CPU 优化而烦恼。