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

本文关键字:搜索 是否 有意义 执行 文件 MemoryMappedFile 大型 文本 使用 | 更新日期: 2023-09-27 18:02:19

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

为每个文件创建MemoryMappedFile,然后遍历每行,匹配关键字,这有意义吗?如果不是,那有什么更好的办法呢?

任何链接到示例代码将不胜感激。

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

是。"几MB"并不是很多,它可以轻松地放入2gb。

您需要使用接受映射大小的构造函数,因为文件将随时间增长。此外,我认为您需要在每个搜索上重新创建访问器或流,但我发现MSDN在这里有点不清楚。

对于Stream,创建StreamReader并读取每一行很简单。整个过程很可能在合理的硬件上受到I/O限制,所以一开始不要为CPU优化而烦恼。

为什么不直接在内存中创建一个结构合理的索引对象树,优化搜索?

编辑:在一些注释后添加…

可以是这样的:

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"];