これは前の質問に似ていますが、そこにある回答は私のニーズを満たしていないため、私の質問は少し異なります。
私は現在、ソートされたデータを含むいくつかの非常に大きなファイルに gzip 圧縮を使用しています。ファイルが圧縮されていない場合、バイナリ検索は、並べ替えられたデータ内の場所へのシークをサポートする便利で効率的な方法です。
しかし、ファイルが圧縮されると、事態は複雑になります。最近、 zlibのオプションについて知りましたZ_FULL_FLUSH
。これは、圧縮中に使用して、圧縮された出力に「同期ポイント」を挿入inflateSync()
できます(その後、ファイル内のさまざまなポイントから読み取りを開始できます)。これは問題ありませんが、この機能を追加するには、既に持っているファイルを再圧縮する必要があります (奇妙なことにgzip
、このオプションはありませんが、必要に応じて独自の圧縮プログラムを作成します)。
ある情報源によると、完全な解決策ではないようZ_FULL_FLUSH
です...すべての gzip アーカイブでサポートされているわけではないだけでなく、アーカイブ内の同期ポイントを検出するというアイデア自体が誤検知を引き起こす可能性があります (同期のマジック ナンバーとの一致による)ポイント、またはZ_SYNC_FLUSH
も同期ポイントを生成しますが、ランダム アクセスには使用できないため)。
より良い解決策はありますか?可能であれば、インデックス作成用の補助ファイルを使用することは避けたいと思います。また、準ランダム アクセスの明示的なデフォルト サポートが役立ちます (10 MB 間隔ごとに読み取りを開始できるように、粒度が大きい場合でも)。gzip よりもランダムな読み取りをより適切にサポートする別の圧縮形式はありますか?
編集: 前述したように、圧縮データでバイナリ検索を実行したいと考えています。特定の (圧縮されていない) 位置をシークする必要はありません。圧縮ファイル内の粗い粒度でシークするだけです。「この圧縮ファイルの約 50% (25%、12.5% など) からデータを解凍する」などのサポートが必要です。