如何在运行之间保留大型Perl对象以便重用?

时间:2010-05-25 10:52:06

标签: perl serialization persistence

我有一个大型XML文件,用XML::Simple解析需要40多秒。

我希望能够缓存生成的解析对象,以便在下次运行时我可以检索已解析的对象而不是重新整理整个文件。

我已经看过使用Data::Dumper,但文档中有点缺乏如何从磁盘文件存储和检索其输出。我看过的其他课程(例如Cache::Cache)似乎是为了存储许多小物件而设计的,而不是单个大物体。

有人可以推荐专为此设计的模块吗?

修改即可。 XML文件为ftp://ftp.rfc-editor.org/in-notes/rfc-index.xml,我使用Storable加速后续运行。更改XML解析器将需要非常重要的代码更改。

在Mac Pro上使用XML::SimpleStorable阅读整个文件的基准数据为:

      s/iter  test1  test2
test1   47.8     --  -100%
test2  0.148 32185%     --

2 个答案:

答案 0 :(得分:11)

Data :: Dumper实际上非常简单。如果您的对象是hashref $HashRef

# Write
open(FILE, ">your_filename") || die "Can not open: $!";
print FILE Data::Dumper->Dump([$HashRef],["HashRef"]);
close(FILE) || die "Error closing file: $!";

# Read
my $HashRef;
$HashRef = eval { do "your_filename" };
   # Might need "no strict;" before and "use strict;" after "do"
die "Error reading: $@" if $@;
# Now $HashRef is what it was before writing

另一个不错的选择是使用Storable。来自POD:

use Storable;
store \%table, 'file';
$hashref = retrieve('file');

有关各种选项的非常好的指南(以及Data :: Dumper使用的更好示例),请参阅Chapter 14 "Persistence" of brian d foy's "Mastering Perl" book

答案 1 :(得分:5)

Storable。这是懒惰的答案。 (Prefer nstore over store.

与数据转储相反的是eval

好的答案是:您真的想学习使用适合繁重处理的XML模块,例如XML::TwigXML::LibXML来加速解析,因此您不需要这个缓存猴子代码。