2010-05-07 11 views
5

Estoy en un servidor compartido con espacio de disco restringido y tengo un archivo gz que se expande súper en un archivo ENORME, más de lo que tengo. ¿Cómo puedo extraerlo "porción" por "porción (digamos 10 MB a la vez), y procesar cada parte, sin extraer todo, ni siquiera temporalmente!GUNZIP/Extraiga el archivo "parte por parte"

No, esto es solo UN archivo comprimido supergrande, no un conjunto de archivos por favor ...


Hola David, su solución se ve muy elegante, pero si estoy preparando bien, parece que cada vez que gunzip extrae desde el principio del archivo (y la salida de eso se descarta). Estoy seguro de que eso causará una gran tensión en el servidor compartido en el que estoy (no creo que sea "lectura anticipada"). ¿Tiene alguna idea de cómo puedo hacer? gunzip "saltar" el número necesario de bloques?

+0

no creo que es posible hacer gzip "salte" el estilo. La especificación gzip (http://www.gzip.org/zlib/rfc-gzip.html#file-format) dice que el formato "no intenta ... Proporcionar acceso aleatorio a datos comprimidos". –

Respuesta

11

Si usted está haciendo esto con herramientas de concha (Unix/Linux), se puede utilizar para descomprimir gunzip -c a la salida estándar, a continuación, utilizar dd con los skip y count opciones para copiar un solo trozo.

Por ejemplo:

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

luego saltar = 1, 2 = saltar, etc.

+0

excelente idea David - no es exactamente lo que busqué, pero lo aceptaré sin embargo ... – Dave

1

Lamentablemente, no conozco un comando de Unix existente que haga exactamente lo que necesita. Podrías hacerlo fácilmente con un pequeño programa en cualquier idioma, p. en Python, cutter.py (cualquier idioma haría igual de bien, por supuesto):

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)) 

Ahora gunzip <huge.gz | python cutter.py 1000000 5 > fifthone pondrá en el archivo fifthone exactamente un millón de bytes, omitiendo los primeros 4 millones de bytes del flujo sin comprimir.