0

我正处于一个简单工具的设计阶段,我想在需要读取大型日志文件的地方编写。为了给你们一些背景,我将首先向你们解释一下。

我需要阅读的日志文件由日志条目组成,这些条目始终包含以下 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,这意味着大量的日志条目。现在这些日志条目可以相互关联,为此我需要从头到尾读取文件。这些关系可以从统计线推导出来。

我想使用统计行中的信息来构建一些数据网格,用户可以使用这些数据网格来搜索数据并进行一些过滤操作。现在我不想将请求/响应行加载到内存中,直到用户真正需要它。此外,我想通过限制加载的请求/响应条目的最大值来保持较小的内存负载。

所以我认为我在第一次解析文件并创建统计索引时需要保存统计行的偏移量。然后,当用户单击某个作为日志条目元素的统计信息时,我使用此偏移量从文件中读取请求/响应。然后我可以保留一些内存池,以确保没有太多加载的请求/响应条目(请参阅前面的请求)。

问题是我不知道用户多久需要一次请求/响应数据。可能很多,也可能是几次。此外,日志文件可以从网络共享加载。

我的问题是:

  1. 这是因为可能有很多读取操作而应该使用内存映射文件的情况吗?还是使用普通文件流更好。顺便提一句。在这个阶段我不需要对日志文件进行写操作,但将来可能会!

到目前为止,如果您有其他提示或发现我的想法存在缺陷,请也告诉我。我愿意接受任何方法。

更新:

澄清一些:

  • 当用户从驱动器或网络共享加载日志文件时,该工具本身必须进行解析。

  • 该工具将被编写为 WinForms 应用程序。

  • 用户可以导出选定的日志条目。目前此导出的格式未知(二进制、文件 db、文本文件)。此导出可以由应用程序本身导入,然后仅显示用户所做的选择。

4

3 回答 3

1

您正在谈论一些在实际条目之间具有一些已定义关系的存储数据......也许只是我,但这种情况只需要某种关系数据库。我建议考虑一些便携式数据库,例如 SQL Server CE。它将使您的生活更轻松,并提供您需要的功能。如果您改用 db,则可以准确查询所需的数据,而无需处理这样的大文件。

于 2012-08-04T00:01:41.197 回答
1

如果您通过网络发送请求/响应块,则网络 send() 时间可能比 seek()/read() 和使用 memmap 之间的差异大得多,这无关紧要。要真正实现这种规模,一个简单的解决方案是将文件分解为许多文件,每个文件用于您要服务的每个块(因为“请求”可以达到 25 MB)。然后,您的 HTTP 服务器将尽可能高效地发送该块(甚至可能使用 zerocopy,具体取决于您的网络服务器)。如果你有很多小的“请求”块,而只有几个大块,你可以只突破超过某个阈值的那些。

于 2012-08-04T00:08:47.357 回答
0

我不同意沃尔特的回答。我会去分贝或所有内存。

为什么您如此关心节省内存,因为 600 MB 并不多。您要在内存小于 2 GB 的机器上运行吗?

将统计信息作为键加载到字典中,将值作为具有两个属性的类 - 请求和响应。字典很快。LINQ 功能强大且速度快。

于 2012-08-04T00:10:42.150 回答