我正处于一个简单工具的设计阶段,我想在需要读取大型日志文件的地方编写。为了给你们一些背景,我将首先向你们解释一下。
我需要阅读的日志文件由日志条目组成,这些条目始终包含以下 3 行格式:
statistics : <some data which is more of less of the same length about 100 chars>
request : <some xml string which can be small (10KB) or big (25MB) and anything in between>
response : <ditto>
日志文件的大小约为 100-600MB,这意味着大量的日志条目。现在这些日志条目可以相互关联,为此我需要从头到尾读取文件。这些关系可以从统计线推导出来。
我想使用统计行中的信息来构建一些数据网格,用户可以使用这些数据网格来搜索数据并进行一些过滤操作。现在我不想将请求/响应行加载到内存中,直到用户真正需要它。此外,我想通过限制加载的请求/响应条目的最大值来保持较小的内存负载。
所以我认为我在第一次解析文件并创建统计索引时需要保存统计行的偏移量。然后,当用户单击某个作为日志条目元素的统计信息时,我使用此偏移量从文件中读取请求/响应。然后我可以保留一些内存池,以确保没有太多加载的请求/响应条目(请参阅前面的请求)。
问题是我不知道用户多久需要一次请求/响应数据。可能很多,也可能是几次。此外,日志文件可以从网络共享加载。
我的问题是:
- 这是因为可能有很多读取操作而应该使用内存映射文件的情况吗?还是使用普通文件流更好。顺便提一句。在这个阶段我不需要对日志文件进行写操作,但将来可能会!
到目前为止,如果您有其他提示或发现我的想法存在缺陷,请也告诉我。我愿意接受任何方法。
更新:
澄清一些:
当用户从驱动器或网络共享加载日志文件时,该工具本身必须进行解析。
该工具将被编写为 WinForms 应用程序。
用户可以导出选定的日志条目。目前此导出的格式未知(二进制、文件 db、文本文件)。此导出可以由应用程序本身导入,然后仅显示用户所做的选择。