Gunzip / extract file "Часть по порции"
-
03-10-2019 - |
Вопрос
Я на совмещенном сервере с ограниченным дисковым пространством, и у меня есть файл 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 миллиона байтов в несжатом потоке.