2010-05-07 22 views
5

मैं प्रतिबंधित डिस्क स्थान के साथ एक साझा सर्वर पर हूं और मुझे एक gz फ़ाइल मिली है जो सुपर को बड़ी फ़ाइल में फैलाता है, जो मुझे मिला है उससे कहीं अधिक है। मैं इसे "भाग" द्वारा "भाग" कैसे निकाल सकता हूं (एक समय में 10 एमबी कहता हूं), और पूरी चीज को अस्थायी रूप से निकालने के बिना प्रत्येक भाग को संसाधित कर सकता है!गुंजिप/फ़ाइल को "भाग से भाग" निकालें

नहीं, यह सिर्फ एक सुपर विशाल संपीड़ित फ़ाइल है, नहीं फ़ाइलों कृपया का एक सेट ...


हाय डेविड, अपने समाधान काफी सुंदर दिखता है, लेकिन अगर मैं यह सही तैयारी कर रहा हूँ, यह हर बार gunzip फ़ाइल की शुरुआत से निकालता है (और उत्पादन की तरह लगता है उसमें से फेंक दिया गया है)। मुझे यकीन है कि साझा सर्वर पर एक बड़ी तनाव पैदा होगी (मुझे लगता है कि यह "आगे पढ़ने" बिल्कुल नहीं है) - क्या आपके पास कोई अंतर्दृष्टि है कि मैं कैसे कर सकता हूं Gunzip ब्लॉक की आवश्यक संख्या "छोड़ें"?

+0

मैं इसे gzip बनाने के उस तरह "आगे बढ़" संभव है विश्वास नहीं है। Gzip spec (http://www.gzip.org/zlib/rfc-gzip.html#file-format) प्रारूप कहता है "प्रारूप का प्रयास नहीं करता है ... संकुचित डेटा तक यादृच्छिक पहुंच प्रदान करें"। –

उत्तर

11

आप (यूनिक्स/लिनक्स) खोल उपकरणों के साथ यह कर रहे हैं तो आप gunzip -c का उपयोग stdout के लिए विस्तारित करने में है, तो skip और count विकल्पों के साथ dd का उपयोग केवल एक हिस्सा कॉपी करने के लिए कर सकते हैं।

उदाहरण के लिए:

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

तो छोड़ = 1, छोड़ = 2, आदि

+0

उत्कृष्ट अंतर्दृष्टि डेविड - यह वही नहीं है जो मैं चाहता हूं, लेकिन मैं इसे स्वीकार करूँगा ... – Dave

1

दुर्भाग्यवश मुझे मौजूदा यूनिक्स कमांड के बारे में पता नहीं है जो आपको वही करता है जो आपको चाहिए। आप इसे किसी भी भाषा में थोड़ा प्रोग्राम के साथ आसानी से कर सकते हैं, उदा। अजगर में, cutter.py (किसी भी भाषा पाठ्यक्रम के बस के रूप में अच्छी तरह से करना होगा,):

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 फ़ाइल fifthone वास्तव में एक लाख बाइट्स में डाल दिया जाएगा, असम्पीडित धारा में पहले 4 लाख बाइट्स लंघन।

संबंधित मुद्दे