GUNZIP / Извлечь файл "порция за порцией" - PullRequest
5 голосов
/ 07 мая 2010

Я на общем сервере с ограниченным пространством на диске, и у меня есть файл gz, который супер расширяется в ОГРОМНЫЙ файл, больше, чем у меня. Как я могу извлечь его «порцией» на «порцию» (скажем, 10 МБ за раз) и обработать каждую порцию, даже не извлекая целую вещь даже временно!

Нет, это просто ОДИН супер огромный сжатый файл, а не набор файлов, пожалуйста ...


Привет, Дэвид, твое решение выглядит довольно элегантно, но если я правильно его читаю, похоже, что каждый раз gunzip извлекает из начала файла (и вывод его выбрасывается). Я уверен, что это вызовет огромную нагрузку на общий сервер, на котором я работаю (я не думаю, что он «читает вперед» вообще) - есть ли у вас какие-либо идеи о том, как я могу заставить gunzip «пропустить» необходимое число блоков?

Ответы [ 2 ]

11 голосов
/ 07 мая 2010

Если вы делаете это с помощью инструментов оболочки (Unix / Linux), вы можете использовать gunzip -c для распаковки на стандартный вывод, а затем использовать dd с параметрами skip и count для копирования только одного фрагмента.

Например:

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

, затем пропустить = 1, пропустить = 2 и т. Д.

1 голос
/ 07 мая 2010

К сожалению, я не знаю существующей команды 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 ровно миллион байтов, пропуская первые 4 миллиона байтов в несжатом потоке.

...