2009-08-04 8 views
5

これは、「実際には実現できない」または「本当に努力する価値がない」という領域に入る可能性がありますが、ここにはあります。マルチパートgzipファイルのランダムアクセス(Javaの場合)

複数パートのgzipファイル内に格納されているレコードにランダムにアクセスしようとしています。具体的には、私が興味を持っているファイルは、Heretrixアークファイルに圧縮されています。 (マルチパートのgzipファイルに精通していない場合、gzipの仕様では複数のgzipストリームを1つのgzipファイルに連結できます。辞書情報は共有されません。私はファイル内の特定のオフセットを探し、gzipマジックヘッダバイト(すなわち0x1f8b、RFC)をスキャンして、次のバイトからgzipストリームを読み込もうと試みることでこれを行うことができるはずだと思っています。このアプローチの問題は、同じバイトが実際のデータ内にも現れることがあるため、これらのバイトを探すことは、gzipストリームの読み込みを無効にする可能性があることです。レコードのオフセットが先験的に分かっていないとすれば、ランダムアクセスを処理するより良い方法はありますか?

答えて

1

あなたが気づいたように、GZIPのデザインはランダムアクセスには向いていません。

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

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

これは100k未満のファイルではかなり高速です。推測のように、10個のファイルがそれぞれ約100kのファイルを持っていれば、それはおそらく現代のCPU上で2秒で行われます。これは私が「かなり速い」という意味です。しかし、あなただけがあなたのアプリケーションのperf要件を知っています。

GZipInputStreamクラスがありますか?もしそうなら、途中にあります。

1

BGZFファイルフォーマットは、GZIPと互換性があり、生物学者によって開発されました。

(...)は、従来のgzip上 BGZFの利点は BGZFが求められて 位置までファイル全体をスキャンする を有することなく、シークを可能にすることです。 http://picard.svn.sourceforge.net/viewvc/picard/trunk/src/java/net/sf/samtools/util/

、BlockCompressedOutputStreamとBlockCompressedInputStream.java

を見て
関連する問題