質問

私は制限されたディスクスペースを備えた共有サーバーを使用しており、私が持っているものよりも多くの巨大なファイルにスーパー拡張するGZファイルを持っています。 「部分」で「部分」を抽出するには(一度に10 MBとしましょう)、各部分を一時的に抽出せずに処理するにはどうすればよいですか?

いいえ、これは1つの非常に巨大な圧縮ファイルであり、ファイルのセットではありません...


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

役に立ちましたか?

解決

(unix/linux)シェルツールでこれを行っている場合、使用できます gunzip -c stdoutに非圧縮するには、使用します dd とともに skipcount 1つのチャンクのみをコピーするオプション。

例えば:

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

次に、スキップ= 1、スキップ= 2など。

他のヒント

残念ながら、必要なことを正確に実行する既存の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))

gunzip <huge.gz | python cutter.py 1000000 5 > fifthone ファイルに入れます fifthone ちょうど100万バイトで、非圧縮ストリームの最初の400万バイトをスキップします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top