web-dev-qa-db-ja.com

内容全体を読み取らずに、zipファイルをテーリングするにはどうすればよいですか?

Gzcatの機能をエミュレートしたい|尾-n。

これは、巨大なファイル(数GB程度)がある場合に役立ちます。このようなファイルの最初の数行を読み取らずに、最後の数行をテールすることはできますか?私はgzipを推測しているので、これは不可能だと思います。エンコーディングは以前のすべてのテキストに依存します。

しかし、それでも、誰かが同様のことを試みたかどうか知りたい-おそらく、そのような機能を提供できる圧縮アルゴリズムについて調査することだ。

40
baskin

いいえ、できません。 zipアルゴリズム はストリームで機能し、その内部コーディングをストリームに含まれるものに適合させて、高い圧縮率を実現します。

ストリームのコンテンツが特定のポイントの前にあることを知らなければ、そのポイントから解凍する方法を知ることは不可能です。

任意の部分を圧縮解除できるアルゴリズムでは、データを圧縮するためにデータを複数回パスする必要があります。

41
Ben S

BGZFは、Samtoolsによって作成されたインデックスgzip圧縮BAMファイルの作成に使用されます。これらはランダムにアクセス可能です。

http://samtools.sourceforge.net/

8
Jeremy Leipzig

最初にファイルに何を入れるかを制御できる場合、それがZipファイルのようなものであれば、ファイル名を所定のサイズのチャンクに昇順で格納し、最後のチャンク/ファイルを解凍するだけで済みます。

3
Jared Updike

それがオプションである場合、bzip2はこの目的に使用するためのより良い圧縮アルゴリズムかもしれません。

Bzip2はブロック圧縮スキームを使用します。そのため、ファイルの最後のチャンクを取得し、最後のチャンクをすべて含めるのに十分な大きさであると確信している場合は、bzip2recoverを使用して回復できます。

ブロックサイズは、ファイルの書き込み時に選択できます。実際、圧縮オプションとして-1(または--fast)を-9(または--best)に設定すると、これが起こります。これは、100kから900kのブロックサイズに対応します。デフォルトは900kです。

Bzip2コマンドラインツールは、パイプラインを使用してこれを行うための適切な方法を提供しませんが、bzip2がストリーム指向ではない場合、おそらくそれは驚くべきことではありません。

1
mc0e

zindexは、時間効率とスペース効率に優れた方法で、圧縮された行ベースのテキストファイルのインデックスを作成およびクエリします。

https://github.com/mattgodbolt/zindex

1
Jeremy Leipzig

完全なgzip互換の疑似ランダムアクセス形式の例は dictzip です。

圧縮の場合、ファイルはデータの「チャンク」に分割され、各チャンクは64kB未満です。 [...]

データに対してランダムアクセスを実行するために、データのオフセットと長さがライブラリルーチンに提供されます。これらのルーチンは、目的のデータが始まるチャンクを決定し、そのチャンクを解凍します。連続するチャンクは必要に応じて解凍されます。」

0
Kirill Bulygin

まあ、できること以前に各ファイルにindexを作成した場合は...

gzipファイルのインデックスを作成するコマンドラインツールを開発しました。これにより、ファイル内でのランダムアクセスが非常に速くなり、アクションとインターリーブされます(抽出、テール、連続テールなど): https://github.com/circulosmeos/gztool

しかし、末尾(-t)を実行すると、インデックスが自動的に作成されます。将来同じことをするつもりなら、はるかに速くなり、とにかく最初は同じですgunzip | tailとしての時間:

$ gztool -t my_file.gz
0
circulosmeos