我已经使用 Moose 创建了一个包,我想要nstore
一些大型实例。生成的二进制文件非常大(500+MB),所以我想压缩它们。
这样做的最佳方法是什么?我应该用等打开一个文件句柄bzip
然后使用存储fd_nstore
吗?
我已经使用 Moose 创建了一个包,我想要nstore
一些大型实例。生成的二进制文件非常大(500+MB),所以我想压缩它们。
这样做的最佳方法是什么?我应该用等打开一个文件句柄bzip
然后使用存储fd_nstore
吗?
使用MooseX::Storage,大部分工作已经为您完成了——您只需要指定您的序列化和 I/O 格式。
虽然压缩当然是一个可行的选择,但您可能还需要考虑简单地序列化 less。
您的对象是否包含大量数据,这些数据可以很容易地从它们也包含的其他数据中重建?例如,如果您的属性是从其他属性懒惰地构建的(例如,使用 Moose 的lazy
+builder
或lazy_build
),那么存储这些属性的值根本没有多大意义,除非重新计算非常昂贵。即便如此,它也可能值得考虑,因为从磁盘读取大量数据也不是最快的事情。
如果您发现只想序列化部分对象,并且仍想使用 Storable,则可以定义自定义STORABLE_freeze
和STORABLE_thaw
挂钩,如 Storable 文档中所述。
但是,还有其他可用的序列化程序。MooseX::Storage 就是其中之一,并且恰好支持许多序列化后端和格式,并且还可以很容易地告知要序列化哪些属性以及为此目的跳过哪些属性。
看看Data::Serializer。它可以选择使用zlib(通过Compress::Zlib)或PPMd(通过Compress::PPMd)来压缩您的序列化数据。