29

gzipで圧縮された非常に大きなファイルがディスク上にあります。実稼働環境は「クラウド」ベースであるため、ストレージのパフォーマンスはひどいですが、CPUは問題ありません。gzip -dc以前は、データ処理パイプラインはディスクからデータをストリーミングすることから始まりました。

ここで、作業を並列化するために、それぞれがバイトオフセットのペア(開始と終了)を取り、ファイルのそのチャンクを受け取る複数のパイプラインを実行したいと思います。プレーンファイルの場合、これはとで実現できますが、圧縮ファイルで効率headtailに行う方法がわかりません。Igzip -dcとパイプをhead使用すると、ファイルの終わりに向かっているオフセットペアは、ファイルがゆっくりと解凍されるため、ファイル全体を無駄に探す必要があります。

だから私の質問は本当にgzipアルゴリズムについてです-その時点までファイル全体を解凍することの完全な意味なしに、基礎となるファイルのバイトオフセットを探すか、その任意のチャンクを取得することは理論的に可能ですか?そうでない場合、I / Oスループットのオーバーヘッドを最小限に抑えながら、複数のプロセスによる「ランダム」アクセスのためにファイルを効率的にパーティション分割するにはどうすればよいでしょうか。

4

4 に答える 4

29

はい、全体を1回順番に読み取り、インデックスを作成することで、gzipファイルにランダムにアクセスできます。zlibディストリビューションのexamples/zran.cを参照してください。

gzipファイルの作成を管理している場合は、ランダムアクセスエントリポイントを構築し、圧縮中にインデックスを作成することで、この目的のためにファイルを最適化できます。

また、zlibでZ_SYNC_FLUSH続いて2つのマーカーを挿入し、次のブロックを前のデータから独立させることにより、マーカーを含むgzipファイルを作成することもできます。これにより圧縮が減少しますが、あまり頻繁に実行しない場合はそれほど多くはありません。たとえば、メガバイトごとに1回は、ほとんど影響がないはずです。次に、9バイトのマーカーを検索できます(bzip2の6バイトのマーカーよりも誤検知の可能性がはるかに低くなります)。Z_FULL_FLUSHdeflate()00 00 ff ff 00 00 00 ff ff

于 2013-01-09T17:09:13.390 に答える
17

gzipでそれを行うことはできませんが、ストリームベースではなくブロックであるbzip2でそれを行うことができます-これは、Hadoop DFSが、MapReduceアルゴリズムでさまざまなマッパーを使用して巨大なファイルの読み取りを分割および並列化する方法です。おそらく、これを利用できるように、ファイルをbz2として再圧縮するのが理にかなっています。ファイルをチャンク化するアドホックな方法よりも簡単です。

これを実装しているパッチをHadoopで見つけました:https ://issues.apache.org/jira/browse/HADOOP-4012

このトピックに関する別の投稿は次のとおりです。Hadoopで読み取られたBZip2ファイル

おそらく、Hadoopソースコードを参照すると、bzip2ファイルをブロックごとに読み取る方法がわかります。

于 2013-01-08T23:30:18.190 に答える
11

gzip実際、ファイルを最初からストリーミングできることを期待しています。途中から始めることはできません。

あなたができることは、ファイルを区分的に圧縮されてgzipから連結されるブロックに分割することです。10MBや100MBなど、各ピースに任意のサイズを選択できます。次に、必要なバイトオフセットを含むピースの先頭から解凍します。あまり知られていない機能gzip(複数の小さいgzipファイルを連結したファイルを解凍すると、小さいファイルをそれぞれ解凍して結果を連結するのと同じ出力が生成される)により、区分的に圧縮された大きいファイルも機能します。標準gzip -d/gunzipすべてをダウンロードする場合。

トリッキーな部分:大きなファイル内の各圧縮部分の先頭のバイトオフセットを含むインデックスを維持する必要があります。

于 2013-01-08T23:33:10.057 に答える
3

FWIW:zlibのzran.cでコマンドラインツールを開発しました。これは、gzipファイルのインデックスを作成し、ファイル内で非常に迅速にランダムアクセスできるようにしますhttps ://github.com/circulosmeos/gztool

まだ成長しているgzipファイルのインデックス(たとえば、rsyslogによってgzip形式で直接作成されたログ)を作成することもできるため、実際にはインデックス作成の時間をゼロにすることができます。-S(監視)オプションを参照してください。

于 2019-07-24T21:23:20.927 に答える