2010-01-06 19 views
11

को संपीड़ित करने का सबसे अच्छा तरीका मुझे सबसे बड़ी संभव आकार में एक बहुत बड़ी एक्सएमएल फ़ाइल को संपीड़ित करने की आवश्यकता है।एक्सएमएल

मैं सी # में काम करता हूं, और मैं इसे कुछ ओपन सोर्स या एप्लिकेशन के रूप में पसंद करता हूं जिसे मैं अपने कोड के माध्यम से एक्सेस कर सकता हूं, लेकिन मैं एक एल्गोरिदम भी संभाल सकता हूं।

धन्यवाद!

+1

मैं ज़्लिब का प्रयास करूंगा। लेकिन स्कीमा-आधारित एक्सएमएल-टू-बाइनरी कनवर्टर्स हो सकते हैं। –

उत्तर

1

एक्सएमएल अत्यधिक संपीड़ित है। आप XML से संपीड़ित ज़िप फ़ाइलों का उत्पादन करने के लिए DotNetZip का उपयोग कर सकते हैं।

+0

@Downvoter - टिप्पणी करने की देखभाल? – Oded

10

का उपयोग कर यह "सबसे छोटा आकार संभव" नहीं हो सकता है यह सेक कर सकते हैं, लेकिन आप उपयोग System.IO.Compression इस्तेमाल कर सकते हैं यह संपीड़ित करने के लिए। ज़िपिंग पाठ के लिए बहुत अच्छा संपीड़न प्रदान करता है।

using (var fileStream = File.OpenWrite(...)) 
using (var zipStream = new GZipStream(fileStream, CompressionMode.Compress)) 
{ 
    zipStream.Write(...); 
} 
1

यदि आपको अधिकतम संपीड़न स्तर की आवश्यकता है तो मैं एलजेएमएमए की सिफारिश करूंगा। एक एसडीके (सी # सहित) है जो ओपन सोर्स 7-ज़िप परियोजना का हिस्सा है, here उपलब्ध है।

+0

आप एक्सएमएल-विशिष्ट संपीड़न एल्गोरिदम के साथ बहुत बेहतर कर सकते हैं। – vy32

3

यदि आपके पास XML फ़ाइल के लिए कोई स्कीमा उपलब्ध है, तो आप EXIficient को आजमा सकते हैं। यह Efficient XML Interchange (EXI) प्रारूप का कार्यान्वयन है जो कि सबसे अच्छा उपलब्ध सामान्य उद्देश्य एक्सएमएल संपीड़न विधि है। यदि आपके पास स्कीमा नहीं है, तो EXI नियमित ज़िप (डिफ्लेट एल्गोरिदम, जो है) से अभी भी बेहतर है, लेकिन बहुत अधिक नहीं, खासकर बड़ी फ़ाइलों के लिए।

EXIficient केवल जावा है लेकिन आप शायद इसे उस एप्लिकेशन में बना सकते हैं जिसे आप कॉल कर सकते हैं। मैं सी # में EXI के किसी भी खुले स्रोत कार्यान्वयन से अवगत नहीं हूं।

6

जैसा ऊपर बताया गया है, कुशल एक्सएमएल इंटरचेंज (ईएसआई) लगातार उपलब्ध सर्वोत्तम एक्सएमएल संपीड़न प्राप्त करता है। स्कीमा के बिना भी, एक्सआई के लिए ज़िप से 2-5 गुना छोटा होना असामान्य नहीं है। स्कीमा के साथ, आप और भी बेहतर करेंगे।

यदि आप वाणिज्यिक कार्यान्वयन का विरोध नहीं कर रहे हैं, तो आप कुशल एक्सएमएल के .NET संस्करण का उपयोग कर सकते हैं और इसे मानक .NET API का उपयोग करके सीधे अपने सी # कोड से कॉल कर सकते हैं। आप http://www.agiledelta.com/efx_download.html से एक निःशुल्क परीक्षण प्रति डाउनलोड कर सकते हैं।

2

फ़ाइल का आकार EXI (या किसी भी बाइनरी योजना) का एकमात्र लाभ नहीं है। प्रोसेसिंग टाइम और मेमोरी ओवरहेड भी इसे पढ़ने/लिखते समय बहुत कम हो जाते हैं। एक प्रोग्राम की कल्पना करें जो बाइट्स को कॉपी करके डिस्क पर फ्लोटिंग पॉइंट नंबर कॉपी करता है। अब कल्पना करें कि एक और प्रोग्राम फ्लोटिंग पॉइंट नंबर को स्वरूपित पाठ में परिवर्तित करता है, और उन्हें एक टेक्स्ट स्ट्रीम में चिपकाता है, और फिर उस महंगे संपीड़न एल्गोरिदम के माध्यम से स्ट्रीम करता है। इस हास्यास्पद उपरि के कारण, एक्सएमएल मूल रूप से बहुत बड़ी फाइलों के लिए उपयोग करने योग्य नहीं है जिसे आसानी से बाइनरी प्रतिनिधित्व के साथ संसाधित किया जा सकता था।

बाइनरी एक्सएमएल एक्सएमएल की इस दीर्घकालिक कमजोरी को संबोधित करने का वादा करता है। एक उपयोगिता बनाना बहुत आसान होगा जो बाइनरी/टेक्स्ट प्रस्तुतियों (एक्सएमएल स्कीमा को जानने के बिना) के बीच परिवर्तित हो जाता है, जिसका अर्थ है कि जब भी आप चाहें तो फ़ाइलों को आसानी से संपादित कर सकते हैं।

1

यदि आप सबसे छोटे संभव आकार की तलाश में हैं तो फास्ट इंफोसेट को बाइनरी एक्सएमएल एन्कोडिंग के रूप में आजमाएं और फिर BZIP2 या LZMA का उपयोग करके संपीड़ित करें। टेक्स्ट एक्सएमएल को संपीड़ित करने या EXI का उपयोग करने से आपको शायद बेहतर परिणाम मिलेंगे। FastInfoset.NET में फास्ट इंफोसेट मानक और कई संपीड़न प्रारूपों के कार्यान्वयन शामिल हैं, लेकिन यह वाणिज्यिक है।