代码之家  ›  专栏  ›  技术社区  ›  Alnitak

如何持久化大型Perl对象以便在运行之间重用?

  •  4
  • Alnitak  · 技术社区  · 14 年前

    我有一个很大的XML文件,用它进行解析需要40多秒 XML::Simple

    我希望能够缓存得到的解析对象,以便在下一次运行时只检索解析的对象,而不重新解析整个文件。

    我研究过使用 Data::Dumper 但是该文档在如何从磁盘文件存储和检索其输出方面有点缺乏。我看过的其他课程(例如。 Cache::Cache 似乎设计用于存储许多小对象,而不是单个大对象。

    有人能推荐一个专门为此设计的模块吗?

    编辑 . XML文件无效 ftp://ftp.rfc-editor.org/in-notes/rfc-index.xml ,我和他一起去了 Storable 加速后续运行。更改XML解析器需要非常重要的代码更改。

    在我的Mac-Pro基准图上用 XML::简单 是:

          s/iter  test1  test2
    test1   47.8     --  -100%
    test2  0.148 32185%     --
    
    2 回复  |  直到 14 年前
        1
  •  11
  •   spoulson    14 年前

    $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 . 从吊舱:

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

    Chapter 14 "Persistence" of brian d foy's "Mastering Perl" book

        2
  •  5
  •   daxim e.dan    14 年前

    Storable . 这是一个懒惰的答案( Prefer nstore over store. )

    eval .

    好的答案是:您真的想学习如何使用适合于诸如 XML::Twig XML::LibXML 为了加快解析速度,您不需要这个缓存猴子代码。