Gunzip / Extract Datei „portionsweise“
-
03-10-2019 - |
Frage
Ich bin auf einem gemeinsam genutzten Server mit eingeschränktem Speicherplatz, und ich habe eine gz Datei bekam, dass Super erweitert sich in eine riesige Datei, mehr als das, was ich habe. Wie kann ich es „Teil“ durch „Teil extrahieren (können zu einem Zeitpunkt 10 MB sagen), und jedes Teil verarbeiten, ohne auch nur vorübergehend, die ganze Sache zu extrahieren!
Nein, das ist nur eine Super große komprimierte Datei, nicht eine Reihe von Dateien bitte ...
Hallo David, Ihre Lösung sieht sehr elegant, aber wenn ich es richtig bereitet, scheint es, wie jedes Mal, gunzip Auszüge aus dem Anfang der Datei (und der Ausgang davon weggeworfen wird). Ich bin sicher, dass eine große Belastung auf dem gemeinsamen genutzten Server würde was ich bin auf (ich glaube nicht, dass sein „Lesen voraus“ überhaupt) - Sie haben keine Erkenntnisse darüber, wie i „überspringen“ die notwendige Anzahl macht gunzip kann von Blöcken?
Lösung
Wenn Sie tun dies mit (Unix / Linux) Shell-Tool, Sie gunzip -c
zu dekomprimieren zu stdout verwenden können, 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, überspringen = 2, etc.
Andere Tipps
Leider weiß ich nicht, von einem vorhandenen Unix-Befehl, der genau das tut, was Sie brauchen. Man könnte es leicht mit einem kleinen Programm in jeder beliebigen Sprache zu tun, zum Beispiel in Python, cutter.py
(beliebige Sprache wäre ebenso natürlich auch tun):
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 gunzip <huge.gz | python cutter.py 1000000 5 > fifthone
wird in der Datei fifthone
setzt genau eine Million Bytes, die ersten 4 Millionen Byte im unkomprimierten Strom zu überspringen.