12

मैं एक gzipped फ़ाइल में यादृच्छिक उपयोग करने में सक्षम होना चाहते हैं। मैं इस पर कुछ प्रीप्रोसेसिंग करने का जोखिम उठा सकता हूं (कहें, किसी प्रकार की अनुक्रमणिका बनाएं), बशर्ते प्रीप्रोसेसिंग का परिणाम फ़ाइल से बहुत छोटा हो।यादृच्छिक अभिगम gzip स्ट्रीम

कोई सलाह?

मेरे विचार थे:

  • हैक एक मौजूदा gzip कार्यान्वयन पर और हर, कहते हैं, 1 संकुचित डेटा की मेगाबाइट अपने decompressor राज्य को क्रमानुसार। फिर यादृच्छिक पहुंच करने के लिए, डिकंप्रेसर राज्य को deserialize और मेगाबाइट सीमा से पढ़ें। यह विशेष रूप से के बाद से मैं जावा के साथ काम कर रहा हूँ, कठिन लगता है और मैं एक शुद्ध जावा gzip कार्यान्वयन :(
  • 1 एमबी की मात्रा में फ़ाइल पुन: सेक और इसके बाद के संस्करण के रूप में भी ऐसा ही नहीं पा सके। यह दोहरीकरण का नुकसान है आवश्यक डिस्क स्थान
  • gzip प्रारूप का एक साधारण पार्सर लिखें जो कोई डिकंप्रेसर नहीं करता है और केवल ब्लॉक सीमाओं का पता लगाता है और अनुक्रमणित करता है (यदि यहां तक ​​कि कोई भी ब्लॉक हैं: मैंने अभी तक gzip प्रारूप विवरण नहीं पढ़ा है)

उत्तर

6

एक नज़र at this link (सी कोड उदाहरण) है।

/* zran.c -- example of zlib/gzip stream indexing and random access 
... 

Gzip सिर्फ एक लिफाफा के साथ zlib है।

+0

धन्यवाद एक नजर है, कि अच्छा है! अगर मुझे केवल जावा से आराम से उपयोग करने का कोई तरीका मिला .. – jkff

+1

@jkff: यदि आपको क्रॉस-प्लेटफ़ॉर्म परिनियोजन की आवश्यकता नहीं है, तो जेएनए देखें। सी पुस्तकालयों को कॉल करने के तरीके के रूप में उपयोग करना आश्चर्यजनक रूप से आसान है। –

+0

फिर से धन्यवाद, मैंने ऐसा किया और यह एक आकर्षण की तरह काम करता है!रेक्स, आपको भी धन्यवाद: मैंने जेएनए का उपयोग किया :) – jkff

0

दिलचस्प सवाल। मुझे समझ में नहीं आता कि आपका दूसरा विकल्प क्यों है (भाग में फ़ाइल को दोबारा दबाएं) डिस्क स्पेस को दोगुना कर देगा। मुझे लगता है कि यह वही होगा, कम ओवरहेड की एक छोटी राशि। यदि आपके पास संपीड़न टुकड़े पर नियंत्रण है, तो यह सही विचार की तरह लगता है।

हो सकता है कि तुम क्या मतलब है कि आप इनपुट पर नियंत्रण की जरूरत नहीं है कि, और इसलिए यह दोगुना हो जाएगा है।

यदि आप इसे कर सकते हैं, तो मैं इसे कंप्रेस्डफाइलस्ट्रीम क्लास के रूप में मॉडलिंग करने की कल्पना कर रहा हूं जो इसकी बैकिंग स्टोर के रूप में उपयोग करता है, 1 एमबी gzip'd blobs की एक श्रृंखला। पढ़ते समय, स्ट्रीम पर एक खोज() उपयुक्त ब्लॉब और डिकंप्रेस पर ले जायेगी। एक ब्लॉब के अंत से पहले एक पढ़ें() धारा को अगले ब्लॉब खोलने का कारण बनता है।

ps: GZIP को IETF RFC 1952 में वर्णित किया गया है, लेकिन यह संपीड़न प्रारूप के लिए DEFLATE का उपयोग करता है। यदि आपने इस कंप्रेस्डफाइलस्ट्रीम क्लास को कार्यान्वित किया है तो मैंने GZIP विस्तार का उपयोग करने का कोई कारण नहीं होगा जैसा कि मैंने कल्पना की है।

+0

मुझे दूसरा विकल्प पसंद नहीं है क्योंकि मैं मूल फ़ाइलों को हटाने नहीं जा रहा हूं, और मेरे पास नियंत्रण नहीं है कि वे कैसे उत्पन्न होते हैं। हालांकि, अभी के लिए मैंने वास्तव में सामान को लागू किया है (जैसा आपने वर्णन किया है), लेकिन मैं इससे संतुष्ट नहीं था और इसलिए मैंने सवाल पूछा :) – jkff

3

बीजीजेड फ़ाइल प्रारूप, जीजीआईपी के साथ संगत जीवविज्ञानी द्वारा विकसित किया गया था।

(...) पारंपरिक gzip से अधिक BGZF का लाभ यह है कि BGZF होने मांग की जा रही स्थिति पर निर्भर पूरी फ़ाइल के माध्यम से स्कैन करने के लिए बिना प्राप्त करने के लिए अनुमति देता है।

http://picard.svn.sourceforge.net/viewvc/picard/trunk/src/java/net/sf/samtools/util/ में, कम से BlockCompressedOutputStream और BlockCompressedInputStream.java

+2

धन्यवाद, यह अच्छा है, लेकिन मुझे तुरंत अपने उपकरण की आवश्यकता है मौजूदा लॉगफाइल, और आमतौर पर उन्हें किसी तृतीय-पक्ष संग्रहकर्ता द्वारा .zip या .gzip में संग्रहीत किया जाता है। इसके अलावा, मुझे पहले से ही एक समाधान समाधान मिल गया है :) – jkff

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