Domanda

Sono su un server condiviso con lo spazio su disco limitato e ho un file di gz che si espande in un file di super enorme, più di quello che ho. Come posso estrarre "porzione" di "parte (diciamo 10 MB alla volta), ed elaborare ogni porzione, senza estrarre il tutto anche solo temporaneamente!

No, questo è solo un eccellente enorme file compresso, non un insieme di file per favore ...


Ciao David, il tuo aspetto soluzione piuttosto elegante, ma se sto preparando bene, sembra che ogni volta estratti gunzip dall'inizio del file (e l'uscita che viene gettato via). Sono sicuro che sarà causa di uno sforzo enorme sul server condiviso io sono sulla (non penso proprio "lettura avanti" a tutti) - hai qualche intuizioni su come posso fare gunzip "saltare" il numero necessario dei blocchi?

È stato utile?

Soluzione

Se stai facendo questo con (Unix / Linux) strumenti di shell, è possibile utilizzare gunzip -c per decomprimere sullo standard output, quindi utilizzare dd con le opzioni skip e count di copiare un solo pezzo.

Ad esempio:

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

quindi saltare = 1, saltare = 2, ecc.

Altri suggerimenti

Purtroppo non so di un comando esistente Unix che fa esattamente quello che ti serve. Si potrebbe fare facilmente con un piccolo programma in qualsiasi lingua, per esempio in Python, cutter.py (qualsiasi lingua farebbe altrettanto bene, ovviamente):

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

Ora gunzip <huge.gz | python cutter.py 1000000 5 > fifthone metterà in file di fifthone esattamente un milione di byte, saltando i primi 4 milioni di byte nel flusso non compresso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top