2010-05-07 14 views
5

Kısıtlı disk alanı olan bir paylaşılan sunucudayım ve süper olan bir GI dosyası, sahip olduğumdan çok BÜYÜK bir dosyaya genişler. "Porsiyon" kısmını "porsiyon" ile (bir kerede 10 MB diyelim) nasıl çıkartabilirim ve her parçayı, hatta geçici olarak tüm nesneyi ayıklamadan işleyebilirim!GUNZIP/Dosyayı "bölüm kısmına göre ayır"

Hayır, bu sadece bir süper büyük sıkıştırılmış dosya değil. dosyaların lütfen bir dizi ...


Merhaba David, çözüm oldukça şık görünüyor, ama ben doğru hazırlıyorlar ediyorsam, bu dosyanın başından ayıklar gunzip her zaman (ve çıkış gibi görünüyor Bunun üzerine atıldım. Eminim ki, paylaştığım paylaşımlı sunucuda büyük bir zorlamaya neden olacağım (hiç "okumayı" düşünmüyorum) - nasıl yapabileceğime dair herhangi bir fikriniz var mı? gunzip "gerekli blok sayısını" atla?

+0

Ben gzip yapmak böyle "ileri atlayıp" mümkün olduğuna inanmıyorum. Gzip spec (http://www.gzip.org/zlib/rfc-gzip.html#file-format), biçimin "sıkıştırılmış veriye rastgele erişim sağlamayı denemesi" şeklindeki biçimini belirtir. –

cevap

11

, daha sonra, Stdout'a sıkıştırmasını yalnızca bir öbek kopyalama skip ve count seçenekleri ile dd kullanmak gunzip -c kullanabilirsiniz. Örneğin

:

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

sonra = 2 atlamak, = 1 atlamak vb

+0

mükemmel içgörü David - onun tam olarak aradığım şey değil ama yine de kabul edeceğim ... – Dave

1

Ne yazık ki tam olarak gereksinim duyduğunuz bir Unix komutunu bilmiyorum. Herhangi bir dilde küçük bir program ile kolayca yapabilirsiniz, ör. Python, cutter.py (herhangi bir dil elbette, sadece de yapardı):

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

Şimdi gunzip <huge.gz | python cutter.py 1000000 5 > fifthone sıkıştırılmamış akışında ilk 4 milyon bayt atlama, dosyanın fifthone tam bir milyon bayt içinde koyacağız. Eğer (Unix/Linux) kabuk araçları ile bu yapıyorsanız

İlgili konular