fichier GUNZIP / extrait « partie par partie »
-
03-10-2019 - |
Question
Je suis sur un serveur partagé avec l'espace disque restreint et j'ai un fichier gz que super prend son envol en un fichier énorme, plus que ce que j'ai. Comment puis-je extraire « partie » par « partie (10 Mo permet de dire à la fois), et traiter chaque partie, sans extraire même temporairement la chose!
Non, c'est juste un super grand fichier compressé, pas un ensemble de fichiers plaisir ...
Salut David, votre apparence solution tout à fait élégante, mais si je prépare les choses, il semble que tous les extraits gunzip de temps depuis le début du fichier (et la sortie de c'est jeté). Je suis sûr que va causer une pression énorme sur le serveur partagé je suis sur (je ne pense pas sa « lecture avant » du tout) - avez-vous des idées sur la façon dont je peux faire gunzip « sauter » le nombre nécessaire des blocs?
La solution
Si vous faites cela avec des outils shell (Unix / Linux), vous pouvez utiliser gunzip -c
pour décomprimer à stdout, puis utilisez dd
avec les options de skip
et count
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.
Autres conseils
Malheureusement, je ne sais pas d'une commande Unix existant qui fait exactement ce dont vous avez besoin. Vous pouvez le faire facilement avec un petit programme dans toutes les langues, par exemple 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))
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 millions d'octets dans le flux non compressé.