Moose を使用してパッケージを作成しましたが、nstoreいくつかの大きなインスタンスが必要です。結果のバイナリ ファイルは非常に大きい (500 MB 以上) ため、圧縮したいと考えています。
それを行うための最良の方法は何ですか?etc.でファイルハンドルを開いてから、bzipを使用して保存する必要がありfd_nstoreますか?
Moose を使用してパッケージを作成しましたが、nstoreいくつかの大きなインスタンスが必要です。結果のバイナリ ファイルは非常に大きい (500 MB 以上) ため、圧縮したいと考えています。
それを行うための最良の方法は何ですか?etc.でファイルハンドルを開いてから、bzipを使用して保存する必要がありfd_nstoreますか?
MooseX::Storageを使用すると、これのほとんどがすでに行われています。シリアライゼーションと I/O フォーマットを指定するだけです。
圧縮は確かに実行可能なオプションですが、単純にシリアル化を減らすことも検討してください。
オブジェクトに含まれる他のデータから簡単に再構築できる大量のデータがオブジェクトに含まれている可能性はありますか? たとえば、他の属性から遅延構築された属性がある場合 (Moose のlazy+builderやを使用するなどlazy_build)、再計算に非常にコストがかかる場合を除き、これらの属性の値を保存しても意味がありません。それでも、ディスクから大量のデータを読み取ることは最速ではないため、検討する価値があるかもしれません.
オブジェクトの一部のみをシリアル化し、それでも Storable を使用したい場合は、Storable のドキュメントで説明されているように、カスタム フックSTORABLE_freezeとフックを定義できます。STORABLE_thaw
ただし、代替のシリアライザーも利用できます。MooseX::Storage はその 1 つで、たまたま多くのシリアライゼーション バックエンドとフォーマットをサポートしており、シリアライズする属性とその目的でスキップする属性を簡単に指定できます。
Data::Serializerをご覧ください。オプションで、zlib(Compress :: Zlib経由)またはPPMd(Compress :: PPMd経由)を使用して、シリアル化されたデータを圧縮します。