
途方もないことがあるとしましょう。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
gztool
chunk.gz
ファイルが終了すると、データの抽出が停止します。
難しいかもしれませんが、圧縮方法やすでに圧縮されているファイルを変更せずに実行できます。ただし、インデックスを作成する必要があります。
ノート:パラメータなしで抽出するもう1つの方法は、-n
gzipファイルを次に埋めることです。足りない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であり、しかし、ディスク容量を占有しません。。seek
inコマンドがなければ、dd
ゼロはすべてディスクに書き込まれますが、これはうまくいきますが、gzip
この方法ではディスク上の不要なスペースを消費しません。これにより、gztoolコマンドにはこの-n
パラメータは必要ありません。インデックスが存在する場合、gztool
圧縮されていない 9009009 バイト位置より前のインデックスポイントにジャンプするために使用されるため、以前のデータはすべて無視されるため、ゼロで指定されたデータは必要ありません。
$ gztool -b 9009009 chunk.gz > extracted_chunk.sql
答え2
gzip
ブロック圧縮ファイルは生成されません。RFC詳細は)本質的にランダムアクセスには適していません。ストリームからデータの読み取りを開始していつでも停止できるため、例は機能しますが、欠落しているcurl -r 0-2024
データ(インデックスファイルなど)を提供する追加のファイルがないと、途中でストリームを取得できません。 ...作るgztool
)。
必要なものを達成するには、特定の種類のブロック圧縮を使用する必要があります。例えば bgzip
(通常は解凍できるファイルを作成しますgzip
)またはbzip2
、受信側でいくつかの操作を行い、ブロック境界がどこにあるかを確認します。 Peter Cockは、このトピックについていくつかの興味深い記事を書きました。BGZF - ブロックされ、より大きく、より良いGZIP!、BZIP2へのランダムアクセス?