我的任务是实现一个搜索功能,搜索几个大的(几个MB)日志文件并返回包含关键字的行。日志文件不断添加到池中,因此每次搜索都必须是动态的。
为每个文件创建MemoryMappedFile然后遍历每一行,匹配关键字是否有意义?如果没有,那么最好的方法是什么?
非常感谢任何示例代码的链接。
答案 0 :(得分:1)
为什么不在内存中创建一个结构合理的索引对象树,针对搜索进行优化?
编辑:在发表评论后添加...
可能是这样的:
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"];
答案 1 :(得分:1)
是。 “几MB”不是很多,它很容易适合2 GB。
您需要使用constructor that takes a mapping size,因为该文件会及时增长。此外,我认为你需要在每次搜索时重新创建Accessor或Stream,但我发现MSDN在这里有点不清楚。
使用Stream,创建StreamReader并读取每一行都是微不足道的。整个过程很可能是I / O绑定在合理的硬件上,因此最初不要为CPU优化而烦恼。