Я нахожусь на общем сервере с ограниченным дисковым пространством, и у меня есть gz файл, который супер расширяется в ОГРОМНЫЙ файл, больше, чем, что я имею. То, как может я извлекать его "часть" "частью (позволяет, говорят, что 10 МБ за один раз), и обрабатывают каждую часть, не извлекая все это даже временно!
Нет, это - всего ОДИН супер огромный сжатый файл, не ряд файлов...
Привет David, Ваше решение выглядит довольно изящным, но если я подготавливаю его право, оно походит каждый раз gunzip на извлечения с начала файла (и вывод того, который выброшен). Я уверен, что это будет вызывать огромную деформацию на общем сервере, я иду (я не думаю его "чтение вперед" вообще) - у Вас есть какое-либо понимание о том, как я могу заставить gunzip "пропустить" необходимое количество блоков?
Если вы делаете это средствами оболочки (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
поместит в файл Fridayone
ровно миллион байтов, пропуская первые 4 миллиона байтов в несжатом потоке.