マルチパートgzipファイルのランダムアクセス(Java)
-
22-07-2019 - |
質問
これは、「現実的ではない」という領域に該当する可能性があります。または「努力する価値がない」しかし、ここに行きます。
マルチパートgzipファイル内に保存されているレコードにランダムにアクセスしようとしています。具体的には、興味のあるファイルは Heretrix Arcファイルを圧縮したものです。 (マルチパートgzipファイルに慣れていない場合、gzip仕様では、複数のgzipストリームを単一のgzipファイルに連結できます。これらは辞書情報を共有せず、単純なバイナリ追加です。)
ファイル内の特定のオフセットを探してこれを実行し、gzipマジックヘッダーバイト(つまり、0x1f8b、 RFC )、次のバイトからgzipストリームの読み取りを試みます。このアプローチの問題は、それらの同じバイトが実際のデータ内にも表示される可能性があるため、それらのバイトを探すとgzipストリームの読み取りを開始する無効な位置につながる可能性があることです。レコードオフセットが事前に知られていない場合、ランダムアクセスを処理するより良い方法はありますか?
解決
GZIPの設計は、ご存じのとおり、ランダムアクセスに適していません。
説明どおりに行うことができます。その後、解凍プログラムでエラーが発生した場合、見つかった署名は実際に圧縮されたデータであると結論付けます。
解凍が完了したら、CRC32を使用して、解凍したばかりのストリームの有効性を簡単に確認できます。
ファイルがそれほど大きくない場合は、すべてのエントリを順番に圧縮解除し、ディレクトリを構築するために署名のオフセットを保持することを検討してください。解凍するときに、バイトをビットバケットにダンプします。その時点でディレクトリが生成され、ファイル名、日付、またはその他のメタデータに基づいてランダムアクセスをサポートできます。
これは、100k未満のファイルではかなり高速です。推測どおり、それぞれが約10万個のファイルが10個ある場合、おそらく最新のCPUで2秒で実行されます。これが「かなり速い」という意味です。ただし、アプリケーションのパフォーマンス要件を知っているのはあなただけです。
GZipInputStreamクラスはありますか?もしそうなら、あなたはそこの途中です。
他のヒント
GZIPと互換性のある BGZF ファイル形式は、生物学者によって開発されました。
(...)の利点 従来のgzipよりもBGZFは BGZFは、 ファイル全体をスキャンする 探しているポジション。
http:/ /picard.svn.sourceforge.net/viewvc/picard/trunk/src/java/net/sf/samtools/util/ 、BlockCompressedOutputStreamおよびBlockCompressedInputStream.java
をご覧ください