1

不久前,我创建了一个日志解析器。日志可以是几千行到几百万行。我将解析的条目存储在哈希引用数组中。

我正在寻找有关如何存储输出的建议,以便在再次运行脚本时可以快速读回它(这可以防止重新解析日志的需要)。

最终目标是拥有一个允许用户创建查询的 Web 界面(基本上将解析的输出视为存在于数据库中)。

我已经考虑将 Data::Dumper 的输出写入文件。

这是一个使用 Data::Dumper 打印的示例数组条目:

$VAR = 
          {
            'weekday' => 'Sun',
            'index' => 26417,
            'timestamp' => '1316326961',
            'text' => 'sys1  NSP
Test.cpp      1000
This is a example error message.
',
            'errname' => 'EM_TEST',
            'time' => {
                        'array' => [
                                     2011,
                                     9,
                                     18,
                                     '06',
                                     22,
                                     41
                                   ],
                        'stamp' => '20110918062241',
                        'whole' => '06:22:41',
                        'hour' => '06',
                        'sec' => 41,
                        'min' => 22
                      },
            'month' => 'Sep',
            'errno' => '2261703',
            'dayofmonth' => 18,
            'unknown2' => '1',
            'unknown3' => '1',
            'year' => 2011,
            'unknown1' => '0',
            'line' => 219154
          },
有没有更有效的方法来实现我的目标?

谢谢!

4

3 回答 3

3

如果您的输出是一个对象(或者如果您想将其变成一个对象),那么您可以使用KiokuDB(以及您选择的数据库后端)。如果没有,那么您可以使用Storable. 当然,如果您的数据结构本质上是模拟 CSV 文件,那么您只需将输出写入文件即可。或者,您可以将数据输出到可以存储在文件中的 JSON 对象中。或者,您可以放弃中间人,直接使用数据库。

您提到您的数据结构是“哈希数组”(大概您的意思是哈希引用数组)。如果每个哈希引用的键相同,则可以将其存储在 CSV 中。

如果不更具体地了解您的数据,您不太可能得到具体的答案。

编辑: 现在您已经发布了一些示例数据,您可以简单地将其写入 CSV 文件或数据库,其中包含indextimestamptexterrnameerrnounknown1unknown2unknown3和的值line

于 2012-04-18T14:17:58.140 回答
1
use Storable;

# fill my hash
store \%hash, 'file';

%hash = ();
%hash = %{retrieve('file')};
# print my hash
于 2012-04-18T18:03:51.360 回答
0

您始终可以使用 KiokuDB、Storable 或我们拥有的任何东西,但如果您打算进行聚合,从长远来看,使用关系数据库(或一些支持查询的数据存储)可能是最好的解决方案。具有 SQLite 等 SQL 引擎且不需要运行数据库服务器的轻量级数据存储可能是一个很好的起点。

于 2012-04-18T18:57:09.777 回答