2009-07-25 17 views
35

私はgzcatの機能をエミュレートしたいですか? tail -n。Zipファイルの内容全体を読み取らずに、どのようにテールしますか?

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

でも、誰かが何か似たようなことをやろうとしたら、そのような機能を提供できる圧縮アルゴリズムを調べてみてください。

+0

gzipはテキストではなくバイナリです。したがって、テールが返すテキストデータのような「行」はありません。 – Gumbo

+0

[類似の質問がある](http://stackoverflow.com/questions/14225751/random-access-to-gzipped-files)、[the zlib FAQ](http://zlib.net/zlib_faq.html#faq28)と[examples/zran.c](https://github.com/madler/zlib/blob/master/examples/zran.c)の[zlib](http:// zlib。ネット)分布。 –

答えて

36

いいえ、できません。 zipping algorithmはストリーム上で動作し、高い圧縮率を達成するためにストリームに含まれているものに内部コーディングを適合させます。

ストリームの内容が特定のポイントより前であることがわからないと、そのポイントからの圧縮解除の方法を知ることは不可能です。

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

+6

これは、ファイルがどのように構築されたかによって部分的にのみ当てはまります。 gzipファイルには複数のストリームを含めることができ、後者のストリームは元のストリームとは完全に独立しています。 gzipファイルを連結するだけで、有効なgzipファイルが得られます。詳細はわかりませんが、ストリームを最後に書き直した場所を見つけることは可能ですが、ストリームを書き込んだものはどれも非常に頻繁に再開すると仮定します。 – mc0e

3

ファイルの内容を制御できる場合は、ZIPファイルのようなものであれば、所定のサイズのチャンクを数字順にファイル名で保存し、最後のチャンク/ファイルを解凍することができます。

+3

これは良い妥協のようです。しかし、営業担当者は、これが圧縮率を低下させることに注意する必要があります。テストによって比率の変更が受け入れられることが示された場合、これは素晴らしいアイデアです。 –

+1

実際には、圧縮辞書をファイルの途中でリセットすることで、ファイル自体を分割してチャンクに分割する必要がなくなります。 –

7

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

http://samtools.sourceforge.net/

+1

正確に。しかし、それは単にsamtoolsやBAMsのためだけではありません!私はそれがラインで区切られたデータのために働くと信じています。 –

+1

BGZFファイルを使用すると、最初にブロックサイズを制限し、次にその長さをBCヘッダー(gzipは無視する)に格納して、解凍せずにランダムアクセスを許可することで、特別に構築されたgzips内のランダムバイトオフセットにアクセスできます。 BAMのようなツールは、ブロック開始のオフセットとブロック内のオフセットを格納することによってオフセットを格納します。行指向の索引付けを行うには、必要な行からオフセットにマップするために、付随するバイまたはタブービックファイルのようなものが必要です(これらはフォーマットとゲノム固有です)。 –

1

それはオプションだ場合、その後、bzip2のは、この目的のために使用することをお勧め圧縮アルゴリズムであるかもしれません。

Bzip2はブロック圧縮方式を使用します。そのため、最後のチャンクをすべて格納するのに十分な大きさのファイルの終わりのチャンクを取得すると、bzip2recoverでそのチャンクを回復できます。

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

bzip2コマンドラインツールでは、パイプラインでこれを行うのに便利な方法はありませんが、bzip2はストリーム指向ではないので、おそらく驚くことではありません。

1

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

https://github.com/mattgodbolt/zindex

関連する問題