【问题标题】:How should I store and compress a Moose object using Perl?我应该如何使用 Perl 存储和压缩 Moose 对象?
【发布时间】:2011-04-20 13:10:23
【问题描述】:

我已经使用 Moose 创建了一个包,我想 nstore 一些大型实例。生成的二进制文件非常大(500+MB),所以我想压缩它们。

这样做的最佳方法是什么? 我应该使用bzip 等打开文件句柄,然后使用fd_nstore 存储吗?

【问题讨论】:

  • 我终于用nstore_fd 和一个用gzip IO 层打开的文件描述符。

标签: perl compression store moose


【解决方案1】:

使用MooseX::Storage,大部分工作已经为您完成——您只需指定您的序列化和 I/O 格式。

【讨论】:

  • 文档真的很小。我怎样才能将它与例如压缩包?
  • @David:我自己只在非常肤浅的情况下使用过 MX:S,但是如果您访问 perl.irc.org #moose,几乎总会有人可以帮助您。
【解决方案2】:

虽然压缩当然是一个可行的选择,但您可能还需要考虑简单地序列化 less。

您的对象是否包含大量数据,这些数据可以很容易地从它们也包含的其他数据中重建?例如,如果您有从其他属性延迟构建的属性(例如使用 Moose 的 lazy + builderlazy_build),那么存储这些属性的值根本没有什么意义,除非重新计算非常令人难以置信昂贵的。即使这样,它也可能值得考虑,因为从磁盘读取大量数据也不是最快的事情。

如果您发现只想序列化部分对象,但仍想使用 Storable,您可以定义自定义 STORABLE_freezeSTORABLE_thaw 挂钩,如 Storable 文档中所述。

但是,还有其他可用的序列化程序。 MooseX::Storage 就是其中之一,并且恰好支持许多序列化后端和格式,并且还可以很容易地告知要序列化哪些属性以及为此目的跳过哪些属性。

【讨论】:

  • 这与此处描述的FastRanges 相关stackoverflow.com/questions/3790166(请参阅原始帖子中的最后更新)。尺寸是获得所需性能所固有的。加载然后重新创建对象仍然要快得多。
【解决方案3】:

看看Data::Serializer。它可以选择使用zlib(通过Compress::Zlib)或PPMd(通过Compress::PPMd) 压缩您的序列化数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    相关资源
    最近更新 更多