使用MemoryMappedFile对大文本文件执行搜索是否有意义?

时间:2011-07-18 14:03:07

标签: c# memory-mapped-files string-search

我的任务是实现一个搜索功能,搜索几个大的(几个MB)日志文件并返回包含关键字的行。日志文件不断添加到池中,因此每次搜索都必须是动态的。

为每个文件创建MemoryMappedFile然后遍历每一行,匹配关键字是否有意义?如果没有,那么最好的方法是什么?

非常感谢任何示例代码的链接。

2 个答案:

答案 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优化而烦恼。