2010-05-07 2 views
5

Je suis sur un serveur partagé avec un espace disque restreint et j'ai un fichier gz qui se développe en un fichier énorme, plus que ce que j'ai. Comment puis-je extraire "portion" par "portion (disons 10 Mo à la fois), et traiter chaque partie, sans extraire le tout même temporairement!GUNZIP/Extraire le fichier "portion par portion"

Non, ce n'est qu'un seul fichier compressé super énorme, pas un ensemble de fichiers ... s'il vous plaît


Salut David, votre solution semble tout à fait élégante, mais si je prépare les choses, il semble que chaque fois que gunzip extrait du début du fichier (et la sortie Je suis sûr que cela causera une énorme pression sur le serveur partagé que je suis (je ne pense pas que c'est "lire avant" du tout) - avez-vous des idées sur la façon dont je peux faire gunzip "sauter" le nombre de blocs nécessaire?

+0

Je ne crois pas qu'il soit possible de faire gzip "sauter en avant" comme ça. La spécification gzip (http://www.gzip.org/zlib/rfc-gzip.html#file-format) indique que le format "n'essaie pas de ... Fournir un accès aléatoire aux données compressées". –

Répondre

11

Si vous faites cela avec des outils shell (Unix/Linux), vous pouvez utiliser gunzip -c pour décomprimer à stdout, puis utilisez dd avec les skip et count options pour copier un seul morceau.

Par exemple:

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

puis sauter = 1, passez = 2, etc.

+0

excellent aperçu David - ce n'est pas exactement ce que je cherchais, mais je vais l'accepter néanmoins ... – Dave

1

Malheureusement, je ne connais pas une commande Unix existante qui fait exactement ce dont vous avez besoin. Vous pouvez le faire facilement avec un petit programme dans n'importe quelle langue, par ex. en Python, cutter.py (toute langue ferait tout aussi bien, bien sûr):

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

Maintenant gunzip <huge.gz | python cutter.py 1000000 5 > fifthone va mettre dans le fichier fifthone exactement un million d'octets, en sautant les 4 premiers million d'octets dans le flux non compressé.

Questions connexes