2010-05-07 3 views
5

Ich bin auf einem freigegebenen Server mit eingeschränktem Speicherplatz und ich habe eine gz-Datei, die super in eine riesige Datei erweitert, mehr als das, was ich habe. Wie kann ich es "portion" durch "Portion (sagen wir 10 MB auf einmal), und bearbeiten Sie jede Portion, ohne die ganze Sache auch nur vorübergehend extrahieren!GUNZIP/Datei "portionsweise" extrahieren

Nein, das ist nur eine super riesige komprimierte Datei, nicht eine Reihe von Dateien bitte ...


Hallo David, sieht Ihre Lösung ganz elegant, aber wenn ich es richtig readying bin, scheint es, wie jedes Mal, gunzip vom Anfang der Datei extrahiert (und den Ausgang Ich bin mir sicher, dass das den Shared Server, auf dem ich arbeite, sehr belasten wird (ich denke nicht, dass es überhaupt "liest") - haben Sie irgendwelche Einsichten darüber, wie ich das machen kann gunzip "überspringen" die notwendige Anzahl von Blöcken?

+0

Ich glaube nicht, es möglich ist, gzip zu machen "überspringen voraus" so. Die gzip spec (http://www.gzip.org/zlib/rfc-gzip.html#file-format) sagt das Format "versucht nicht ... Direkten Zugriff auf komprimierte Daten bereitzustellen". –

Antwort

11

Wenn Sie dies tun mit (Unix/Linux) Shell-Tools können Sie gunzip -c verwenden, um stdout zu dekomprimieren, dann verwenden dd mit den skip und count Optionen nur ein Klumpen zu kopieren.

Zum Beispiel:

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

dann überspringen = 1, skip = 2 etc.

+0

ausgezeichnete einblick David - es ist nicht genau das, was ich suche, aber ich werde es trotzdem akzeptieren ... – Dave

1

Leider kenne ich keinen vorhandenen Unix-Befehl, der genau das tut, was Sie brauchen. Sie könnten es leicht mit einem kleinen Programm in irgendeiner Sprache, z.B. in Python, cutter.py (würde jede Sprache genauso gut, natürlich):

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

Jetzt wird gunzip <huge.gz | python cutter.py 1000000 5 > fifthone in Datei setzt fifthone genau eine Million Bytes, die ersten 4 Millionen Byte im unkomprimierten Strom zu überspringen.