2011-08-02 21 views
0

大きなファイル(40 GB)を圧縮してアーカイブに保存するシステムで作業しています。インデックス付き圧縮ライブラリ

現在、私はlibz.aを使ってC++でファイルを圧縮していますが、ファイルからデータを取り出そうとするときには、すべてを抽出する必要があります。誰もが元のファイルの位置のインデックスを格納することができますし、ファイル全体を解凍するのではなく、必要なものを探し出す圧縮コンポーネント(できれば.NET互換)を知っていますか?

例:私は、私は唯一の位置10-27の間、元のファイルで発生するファイルに必要なデータを知っているので、私は圧縮された元のファイルの位置をマッピングする方法を希望

Original File  Compressed File 
10 - 27   => 2-5 
100-202   => 10-19 
.............. 
10230-102020 => 217-298 

ファイルの位置。

この機能を提供できる圧縮ライブラリや同様のツールを知っている人はいますか?

+1

私がここに見る問題は、ほとんどの圧縮アルゴリズムがそのような機能をサポートしていないことです。なぜなら、解凍100-202は以前のデータを必要とする。もしあなたがあなたの質問を拡大できますか?あなたは元のファイルのどの部分をあなたが将来圧縮解除したいのか知っていますか?あなたは確信しています、あなたは90-202ではなく100-202を解凍するでしょうか?これは私が考えて助けることができる –

答えて

1

解決策があなたの要件に依存するので、これはあなたに多くの助けになるかどうかはわかりませんが、私が取り組んでいるプロジェクトに似た問題があった(少なくとも私はそう考えています)。多くのテキスト記事をドライブに保存し、無作為にアクセスしてください。データのサイズのために圧縮する必要があります。

このすべてのデータを一度に圧縮するという問題は、ほとんどのアルゴリズムが復元時に以前のデータに依存することです。例えば、普及しているLZWメソッドは、解凍中にadictionary(データを解凍する方法に関する命令)を作成しますので、途中からストリームを解凍することはできませんが、それらのメソッドが調整されている可能性があります。

解決方法圧縮率を下げても、データをまとめることが最も効果的であることが判明しました。私のプロジェクトでは単純でした。各記事​​は1つのチャンクで、1つずつ圧縮した後、それぞれのチャンクが始まる場所にインデックスファイルを作成しました。その場合、簡単に解凍できました。私が望む記事

だから、私のファイルはこのように見えた:

Index; compress(A1); compress(A2); compress(A3)

代わりの

compress(A1;A2;A3)

このようにエレガントな方法でデータを分割できない場合は、チャンクを人為的に分割することができます。たとえば、データを5MB単位でパックすることができます。したがって、7MBから13MBのデータを読み込む必要がある場合は、チャンク5-10と10-15を解凍します。 あなたのインデックスファイルは、その後、次のようになります。

0  -> 0 
5MB -> sizeof(compress 5MB) 
10MB -> sizeof(compress 5MB) + sizeof(compress next 5MB) 

この解決策の問題は、それがわずかに悪化し、圧縮比を与えるということです。チャンクが小さいほど、圧縮が悪くなります。

他のファイルをハードディスクに保存しなければならないわけではありません。ファイルを1つのファイルにまとめて、いつ起動するのかを覚えておいてください。

また、http://dotnetzip.codeplex.com/は、圧縮に使用できるzipファイルを作成するための素晴らしいライブラリであり、C#で書かれています。私にはうってつけで、1つのzipファイルに多数のファイルを作成するという組み込みの機能を使用して、データを分割することができます。