我创建了一个使用Moose的包,我想nstore
一些大的实例。由此产生的二进制文件非常大(500 + MB),所以我想压缩它们。我应该如何使用Perl存储和压缩Moose对象?
这样做的最佳方法是什么? 我是否应该用bzip
等打开文件句柄,然后使用fd_nstore
进行存储?
我创建了一个使用Moose的包,我想nstore
一些大的实例。由此产生的二进制文件非常大(500 + MB),所以我想压缩它们。我应该如何使用Perl存储和压缩Moose对象?
这样做的最佳方法是什么? 我是否应该用bzip
等打开文件句柄,然后使用fd_nstore
进行存储?
看看Data::Serializer。它可以选择使用zlib(通过Compress::Zlib)或PPMd(通过Compress::PPMd)压缩您的序列化的数据
随着MooseX::Storage,这个最适合你已经完成 - 你只需要指定你的序列化和I/O格式
。该文档非常小。我怎样才能将它与例如gzip的? – 2010-10-03 19:25:19
@David:我只是在很肤浅的情况下使用MX:S,但是如果你在perl.irc.org #moose上跳转,那么几乎总是有人可以帮助你。 – Ether 2010-10-03 19:51:18
虽然压缩无疑是一个可行的选择,你可能还需要考虑简单序列化少。
会不会是你的对象包含大量的数据,可以很容易地从其他数据也包含哪些内容?例如重建,如果你有属性是从其他属性延迟构建的(例如使用Moose的lazy
+ builder
或lazy_build
),除非重新计算令人难以置信的昂贵,否则根本没有必要存储这些属性的值。即便如此,也许值得考虑,因为从磁盘读取大量数据也不是最快的事情。
如果你发现你想要序列化你的对象只有部分,并仍想使用耐储藏,你可以自定义的定义STORABLE_freeze
和STORABLE_thaw
挂钩,如可存储的文档中描述。
但是,也有可用的替代串行器。 MooseX :: Storage是其中之一,并且恰好支持许多序列化后端和格式,并且还可以很容易地告知要序列化哪些属性以及为此目的跳过哪些属性。
这与此处描述的FastRanges有关http://stackoverflow.com/questions/3790166(请参阅原始文章中的最新更新)。获得所需性能的大小是固有的。加载然后重新创建对象仍然快得多。 – 2010-10-03 20:39:11
我最终使用了'nstore_fd'和一个用gzip IO层打开的文件描述符。 – 2010-10-08 06:46:14