6

これは、「実現不可能」または「努力する価値がない」の領域に入る可能性がありますが、ここでは説明します。

マルチパート gzip ファイル内に保存されているレコードにランダムにアクセスしようとしています。具体的には、私が興味を持っているファイルは、圧縮されたHeretrix Arc ファイルです。(マルチパート gzip ファイルに慣れていない場合は、gzip 仕様により、複数の gzip ストリームを単一の gzip ファイルに連結できます。それらは辞書情報を共有せず、単純なバイナリの追加です。)

ファイル内の特定のオフセットを探し、gzip マジック ヘッダー バイト (つまり、RFCに従って 0x1f8b) をスキャンし、次のバイトから gzip ストリームを読み取ろうとすることで、これを実行できるはずだと考えています。 . このアプローチの問題は、同じバイトが実際のデータ内にも現れる可能性があることです。そのため、これらのバイトを探すと、gzip ストリームの読み取りを開始する位置が無効になる可能性があります。レコード オフセットがアプリオリに知られていない場合、ランダム アクセスを処理するより良い方法はありますか?

4

2 に答える 2

3

GZIP と互換性のあるBGZFファイル形式は、生物学者によって開発されました。

(...) 従来の gzip に対する BGZF の利点は、BGZF を使用すると、検索対象の位置までファイル全体をスキャンする必要なくシークできることです。

http://picard.svn.sourceforge.net/viewvc/picard/trunk/src/java/net/sf/samtools/util/で、BlockCompressedOutputStream と BlockCompressedInputStream.java を見てください。

于 2010-04-22T10:03:43.777 に答える
1

ご存知のように、GZIPの設計はランダムアクセスに適していません。

説明どおりに実行できます。その後、デコンプレッサでエラーが発生した場合は、見つかった署名が実際には圧縮データであると結論付けます。
解凍が完了したら、CRC32を使用して、解凍したばかりのストリームの有効性を簡単に確認できます。

ファイルがそれほど大きくない場合は、すべてのエントリを連続して解凍し、署名のオフセットを保持してディレクトリを構築することを検討してください。解凍するときに、バイトをビットバケットにダンプします。その時点でディレクトリが生成され、ファイル名、日付、またはその他のメタデータに基づいてランダムアクセスをサポートできます。

これは、100k未満のファイルではかなり高速になります。推測どおり、それぞれ約100kのファイルが10個ある場合、最新のCPUではおそらく2秒で実行されます。これが私が「かなり速い」という意味です。ただし、アプリケーションのパフォーマンス要件を知っているのはあなただけです。

GZipInputStreamクラスはありますか?もしそうなら、あなたはそこの途中です。

于 2009-08-04T01:53:12.603 に答える