6

私は、ディスク容量が制限された共有サーバーを使用しており、gz ファイルを持っています。これは、私が持っている以上の巨大なファイルに超拡張されます。「部分」ごとに「部分」(一度に10 MBとしましょう) を抽出し、一時的にでも全体を抽出することなく、各部分を処理するにはどうすればよいですか!

いいえ、これは 1 つの超巨大な圧縮ファイルであり、一連のファイルではありません...


こんにちはデイビッド、あなたのソリューションは非常にエレガントに見えますが、私が正しく準備していれば、毎回 gunzip がファイルの先頭から抽出されるようです (そしてその出力は破棄されます)。私が使用している共有サーバーに大きな負担がかかると確信しています(「先読み」はまったく考えていません)-gunzipを必要な数だけ「スキップ」させる方法についての洞察はありますかブロックの?

4

2 に答える 2

13

(Unix/Linux) シェル ツールでこれを行う場合は、 を使用gunzip -cして標準出力に解凍しddskipおよびcountオプションを使用して 1 つのチャンクのみをコピーできます。

例えば:

gunzip -c input.gz | dd bs=10485760 skip=0 count=1 >output

次に、skip=1、skip=2 など。

于 2010-05-07T04:14:37.493 に答える
1

残念ながら、必要なことを正確に実行する既存の Unix コマンドについては知りません。Python など、任意の言語の小さなプログラムで簡単に実行できますcutter.py(もちろん、どの言語でも同様に実行できます)。

import sys
try:
  size = int(sys.argv[1])
  N = int(sys.argv[2])
except (IndexError, ValueError):
  print>>sys.stderr, "Use: %s size N" % sys.argv[0]
  sys.exit(2)
sys.stdin.seek((N-1) * size)
sys.stdout.write(sys.stdin.read(size))

非圧縮ストリームの最初の 400 万バイトをスキップして、正確に 100 万バイトgunzip <huge.gz | python cutter.py 1000000 5 > fifthoneをファイルに入れるようになりました。fifthone

于 2010-05-07T04:12:09.537 に答える