【问题标题】:Perl Parsing Log/Storing Results/Reading ResultsPerl 解析日志/存储结果/读取结果
【发布时间】:2012-04-18 14:11:42
【问题描述】:

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

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

最终目标是拥有一个允许用户创建查询的 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
          },
有没有更有效的方法来实现我的目标?

谢谢!

【问题讨论】:

  • Storable 模块怎么样?
  • 该数据中有 很多 冗余。如果你存储了timestamp的值,那么你可以扔掉whole,hour,sec,min,month,dayofmonth,year等。

标签: perl writing


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的建议。由于 cmets 的空间有限,我更新了我的描述以包含更多信息。
  • @trialUnplugged - 您可以省去麻烦并将基本数据存储到 CSV 文件或数据库中。请参阅上面的编辑。
【解决方案2】:
use Storable;

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

%hash = ();
%hash = %{retrieve('file')};
# print my hash

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 2013-11-01
      • 2012-01-16
      • 1970-01-01
      • 2016-01-23
      • 1970-01-01
      • 2017-06-22
      相关资源
      最近更新 更多