gzipで圧縮された非常に大きなファイルがディスクに置かれています。運用環境は「クラウド」ベースなので、ストレージのパフォーマンスはひどいですが、CPUは問題ありません。以前は、データ処理パイプラインがgzip -dc
から始まり、ディスクからデータをストリーミングしていました。gzippedファイルへのランダムアクセス?
作業を並列化するために、それぞれ開始オフセットと終了オフセットのペアを取る複数のパイプラインを実行し、そのファイルのチャンクを取得します。プレーンファイルの場合、これはhead
とtail
で実現できますが、圧縮ファイルで効率的に処理する方法がわかりません。もし私がgzip -dc
とパイプhead
には、ファイルの終わりに向かっているオフセットのペアはゆっくりと解凍されているので、ファイル全体を無駄に検索することになります。
私の質問は実際にgzipアルゴリズムに関するものです。理論的には、基礎ファイルのバイトオフセットを探したり、任意のチャンクを取得したりできます。ファイル全体を解凍してそのポイントまで解凍することはできますか?そうでなければ、I/Oスループットのオーバーヘッドを最小限に抑えながら、複数のプロセスで「ランダム」なアクセスを効率的にファイルに分割する方法はありますか?
まず、ブロックを見つけるためにbzip2ファイルを順番に読み取る必要があります。その後、個別にアクセスできます。 gzip形式でも同じことができます。 –
あなたが言及したことは、圧縮ファイルにランダムアクセスするための最良の方法だとは思いません。この記事をご覧ください:http://blastedbio.blogspot.com/2011/11/bgzf-blocked-bigger-better-gzip.htmlまた、Hadoopのこの課題トラッカー:https://issues.apache.org/jira/browse/HADOOP-4012 –
私が答えたように、最適化されたランダムアクセスのためのgzipファイルを用意することができます。ランダムアクセスのアプリケーションの中には、gzipファイルの作成を制御しているものがあります。その場合、その目的のためにgzipファイルを準備し、同時にインデックスを作成します。いくつかのアプリケーションはgzipファイルの作成を制御していません。その場合、インデックスを構築するために一度解凍する必要があります。 –