Вопрос

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

Нет, это всего лишь один супер огромный сжатый файл, а не набор файлов, пожалуйста ...


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

Это было полезно?

Решение

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

Например:

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

Затем Skip = 1, Skip = 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 Ровно миллион байтов, пропуская первые 4 миллиона байтов в несжатом потоке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top