2009-08-04 13 views
5

यह "वास्तव में व्यवहार्य नहीं" या "वास्तव में प्रयास के लायक नहीं" के दायरे में पड़ सकता है लेकिन यहां जाता है।बहु-भाग gzip फ़ाइल यादृच्छिक पहुंच (जावा में)

मैं बहु-भाग gzip फ़ाइल के अंदर संग्रहीत रिकॉर्ड्स को यादृच्छिक रूप से एक्सेस करने का प्रयास कर रहा हूं। विशेष रूप से, जिन फ़ाइलों में मुझे रूचि है उनमें संकुचित Heretrix आर्क फ़ाइलें हैं। (यदि आप बहु-भाग gzip फ़ाइलों से परिचित नहीं हैं, तो gzip spec एकाधिक gzip streams को एक gzip फ़ाइल में संयोजित करने की अनुमति देता है। वे किसी भी शब्दकोश की जानकारी साझा नहीं करते हैं, यह सरल बाइनरी संलग्न है।)

मुझे लगता है कि फ़ाइल के भीतर एक निश्चित ऑफसेट की तलाश करके ऐसा करना संभव होना चाहिए, फिर RFC के अनुसार gzip magic header बाइट्स (यानी 0x1f8b) स्कैन करें, और निम्न बाइट्स से gzip स्ट्रीम को पढ़ने का प्रयास करें । इस दृष्टिकोण के साथ समस्या यह है कि वही बाइट वास्तविक डेटा के अंदर भी दिखाई दे सकते हैं, इसलिए उन बाइट्स की तलाश करने से एक जीजीआईपी स्ट्रीम पढ़ने शुरू करने के लिए एक अमान्य स्थिति हो सकती है। क्या यादृच्छिक अभिगम को संभालने का कोई बेहतर तरीका है, यह देखते हुए कि रिकॉर्ड ऑफसेट को प्राथमिकता नहीं माना जाता है?

उत्तर

1

जैसा कि आपने महसूस किया है, जीजेआईपी का डिज़ाइन यादृच्छिक पहुंच के अनुकूल नहीं है।

जैसा कि आप वर्णन करते हैं, आप कर सकते हैं, और फिर यदि आप डिकंप्रेसर में एक त्रुटि में भाग लेते हैं, तो निष्कर्ष निकालें कि आपके द्वारा प्राप्त हस्ताक्षर वास्तव में संपीड़ित डेटा था।
यदि आप डिकंप्रेसिंग खत्म करते हैं, तो सीआरसी 32 के माध्यम से स्ट्रीम की वैधता को केवल डीकंप्रेस किया जाना आसान है।

यदि फ़ाइलें इतनी बड़ी नहीं हैं, तो आप निर्देशिका में सभी प्रविष्टियों को केवल संपीड़ित करने और हस्ताक्षर के ऑफसेट को बनाए रखने पर विचार कर सकते हैं ताकि निर्देशिका तैयार की जा सके। जैसे ही आप डिकंप्रेस करते हैं, बाइट्स को थोड़ी बाल्टी में डंप करें। उस बिंदु पर आप एक निर्देशिका उत्पन्न करेंगे, और फिर आप फ़ाइल नाम, दिनांक या अन्य मेटाडेटा के आधार पर यादृच्छिक पहुंच का समर्थन कर सकते हैं।

यह 100k से नीचे फ़ाइलों के लिए उचित रूप से तेज़ होगा। अनुमान के मुताबिक, अगर आपके पास लगभग 100k की 10 फाइलें थीं, तो संभवतः यह आधुनिक सीपीयू पर 2 एस में की जाएगी। मेरा मतलब है "बहुत तेज़"। लेकिन केवल आप अपने आवेदन की perf आवश्यकताओं को जानते हैं।

क्या आपके पास GZipInputStream क्लास है? यदि ऐसा है तो आप वहां आधे रास्ते हैं।

1

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

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

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

पर एक नजर है
संबंधित मुद्दे