オフセットを使用して部分的にダウンロードされたgzipを読む

オフセットを使用して部分的にダウンロードされたgzipを読む

途方もないことがあるとしましょう。db.sql.gz利用可能なサイズ100 GBhttps://example.com/db/backups/db.sql.gzとサーバーのサポート範囲要求

だからダウンロードしたファイル全体をダウンロードする代わりにyオフセット付きバイト(1024バイトと仮定)xバイト(1000バイトと仮定)は次のとおりです。

curl -r 1000-2024 https://example.com/db/backups/db.sql.gz

上記のコマンドを使用してgzip圧縮ファイルの一部をダウンロードできました。さて、その部分をどのように読むことができるのか疑問に思います。

試しましたが、gunzip -c db.sql.gz | dd ibs=1024 skip=0 count=1 > o.sqlエラーが発生しました。

gzip:dbrange.sql.gz:gzip形式ではありません

エンコードを記述するファイルの上部にヘッダーブロックがある可能性があると推測されるため、エラーは許可されます。


オフセットなしでファイルをダウンロードすると、gunzipパイプを使用してファイルを読み取ることができることがわかりました。

curl -r 0-2024 https://example.com/db/backups/db.sql.gz

ベストアンサー1

ただFWIW、以前は、gzipにランダムにアクセスできます。索引ファイルが作成されました...

インデックスが提供されたら、gzipへの高速で(ほぼ)ランダムアクセスを提供するコマンドラインツールを開発しました(そうでない場合は自動的に作成されます)。

https://github.com/circulosmeos/gztool

gztoolチャンクがインデックスが指す特定のバイトポイント(もちろん、gzipはバイトではなくビットストリームなので、-1バイト)から取得された場合は、元のgzipファイルのチャンクにアクセスするために使用できます。彼らの後。

例えばインデックスポイントが始まる場合gztool -ll index.gziこのデータ提供)バイト圧縮1508611ファイルのgzip部分、それ以降は1M圧縮バイトが必要です。

$ curl -r 1508610-2508611 https://example.com/db/backups/db.sql.gz > chunk.gz
  • chunk.gzディスクのブロックサイズだけを占めることに注意してください。
  • また、そういう点も参考にしてくださいいいえ不完全なため、有効なgzipファイルです。
  • また、目的のインデックスポイント位置で1バイト少なく検索したことも検討してください。

インデックス全体も検索する必要があります(たとえば、gztool -i *.gzすべてのgzip圧縮ファイルのインデックス作成、gztool -c *圧縮、インデックス作成など、以前は一度だけ作成されます)。インデックスはgzipサイズの約0.3%です(gztoolデータ自体が圧縮されるとインデックスははるかに小さくなります)。

$ curl https://example.com/db/backups/db.sql.gzi -o chunk.gzi

これで、次の方法で抽出を実行できます。グリッドツール。その圧縮されていない圧縮バイト1508610(またはそれを渡すバイト)を知る必要がありますが、インデックスを使用できますgztool -llここの例。バイト9009009だとしましょう。あるいは、私たちが望む圧縮されていないバイトは、単にChunk.gzに含まれている対応する最初のインデックスポイントに渡されます。この場合、バイトも9009009であると仮定します。

$ gztool -n 1508610 -b 9009009 chunk.gz > extracted_chunk.sql

gztoolchunk.gzファイルが終了すると、データの抽出が停止します。

難しいかもしれませんが、圧縮方法やすでに圧縮されているファイルを変更せずに実行できます。ただし、インデックスを作成する必要があります。


ノート:パラメータなしで抽出するもう1つの方法は、-ngzipファイルを次に埋めることです。足りないZero: 例では、次のddコマンドを実行します。今後最初はファイルをcurl検索するために使用されます。したがって、次のようになります。chunk.gz

$ dd if=/dev/zero of=chunk.gz seek=1508609 bs=1 count=0
$ curl -r 1508610-2508611 https://example.com/db/backups/db.sql.gz >> chunk.gz
$ curl https://example.com/db/backups/db.sql.gzi -o chunk.gzi

このように、ファイルの最初の1508609バイトは0であり、しかし、ディスク容量を占有しません。seekinコマンドがなければ、ddゼロはすべてディスクに書き込まれますが、これはうまくいきますが、gzipこの方法ではディスク上の不要なスペースを消費しません。これにより、gztoolコマンドにはこの-nパラメータは必要ありません。インデックスが存在する場合、gztool圧縮されていない 9009009 バイト位置より前のインデックスポイントにジャンプするために使用されるため、以前のデータはすべて無視されるため、ゼロで指定されたデータは必要ありません。

$ gztool -b 9009009 chunk.gz > extracted_chunk.sql

おすすめ記事