【发布时间】:2012-08-03 23:51:58
【问题描述】:
我正处于一个简单工具的设计阶段,我想在需要读取大型日志文件的地方编写。为了给你们一些背景信息,我将首先向你们解释一下。
我需要阅读的日志文件由日志条目组成,这些条目总是由以下 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、文本文件)。此导出可由应用程序本身导入,然后仅显示用户所做的选择。
【问题讨论】:
-
旁注:你真的需要考虑你的目标是什么......到目前为止,你的问题是“我不知道我想要什么,但它足够快吗?”由于您将其标记为“性能”,因此您应该记住某种数字。 IE。如果“保持较小的内存负载”是唯一的目标——一次只读取一条记录,甚至按顺序搜索整个文件是完全可以的......在你得到合理的要求之前,你将无法优化任何东西——“需要。 ..data..很多可能是几次”需要几乎相反的优化。
标签: c# performance memory file-io