gzip

2009-06-08 13 views
5

का उपयोग कर .net ऑब्जेक्ट आवृत्ति को संपीड़ित करने के लिए मैं कैश में जोड़ने से पहले डेटाबेस के QUERYS से परिणामों को संपीड़ित करना चाहता हूं।gzip

मैं किसी संदर्भ प्रकार को संपीड़ित करने में सक्षम होना चाहता हूं।

मैं .. तार संपीड़ित करने स्कॉट Hanselman के ब्लॉग पोस्ट http://shrinkster.com/173t

एक .net वस्तु को संपीड़ित करने के लिए किसी भी विचार के आधार पर विचार के लिए इस की एक काम संस्करण है?

मुझे पता है कि यह एक रीड ओनली कैश हो जाएगा के बाद से कैश में वस्तुओं सिर्फ बाइट सरणियों हो जाएगा ..

उत्तर

20

यह किसी भी संदर्भ प्रकार के लिए काम नहीं करेगा। यह Serializable प्रकारों के लिए काम करेगा। एक संपीड़न धारा जो एक फाइल करने के लिए पहुंचाया जाता है करने के लिए एक BinaryFormatter ऊपर हुक:

var formatter = new BinaryFormatter(); 
using (var outputFile = new FileStream("OutputFile", FileMode.CreateNew)) 
using (var compressionStream = new GZipStream(
         outputFile, CompressionMode.Compress)) { 
    formatter.Serialize(compressionStream, objToSerialize); 
    compressionStream.Flush(); 
} 

आप एक MemoryStream इस्तेमाल कर सकते हैं बल्कि एक फाइल करने के लिए लिखने की तुलना में स्मृति में सामग्री धारण करने के लिए,। मुझे संदेह है कि यह कैश के लिए वास्तव में एक प्रभावी समाधान है।

+1

धन्यवाद, यह वास्तव में सहायक रहा है, डिकंप्रेस कैसा दिखता है ... पहले कभी बाइनरीफॉर्मेटर का उपयोग नहीं किया गया था। –

+0

इस कोड को आसानी से कॉपी करने के लिए धन्यवाद + मेरे कोड में पेस्टेबल। मैं अक्सर चीजों को प्रारूपित करता हूं कि यह अब सिर्फ एक स्निपेट है जिसे मैं आसानी से Google पर ढूंढ सकता हूं। +1 –

3

कैश में आप किस प्रकार की वस्तुएं डाल रहे हैं? क्या वे वस्तुओं को टाइप कर रहे हैं? या DataTable जैसी चीजें? DataTable के लिए, शायद GZipStream के माध्यम से संपीड़ित एक्सएमएल के रूप में स्टोर करें। टाइप की गई (इकाई) ऑब्जेक्ट्स के लिए, आपको शायद उन्हें क्रमबद्ध करने की आवश्यकता होगी।

आप BinaryFormatter और GZipStream, इस्तेमाल कर सकते हैं या यदि आप बस protobuf-net क्रमबद्धता (मुक्त) जो पहले से ही बहुत कॉम्पैक्ट है की तरह कुछ इस्तेमाल कर सकते हैं (- जो घने द्विआधारी की खासियत है GZipStream जोड़ने आम तौर पर डेटा बड़ा करता है)। विशेष रूप से, प्रोटोबफ-नेट जैसी चीज़ों का लाभ यह है कि आप deserialization के दौरान इसे अनजिप करने की CPU लागत का भुगतान किए बिना कम आकार प्राप्त करते हैं। some testsGZipStream जोड़कर, यह BinaryFormatter से 4 गुना तेज था। GZip के लिए BinaryFormatter पर अतिरिक्त समय जोड़ें और इसे पर काफी मार्जिन से जीतना चाहिए।

2

मैंने अभी अपने ऐप के लिए GZipStream समर्थन जोड़ा है, इसलिए मैं यहां कुछ कोड साझा कर सकता हूं;

क्रमबद्धता:

using (Stream s = File.Create(PathName)) 
{ 
    RijndaelManaged rm = new RijndaelManaged(); 
    rm.Key = CryptoKey; 
    rm.IV = CryptoIV; 
    using (CryptoStream cs = new CryptoStream(s, rm.CreateEncryptor(), CryptoStreamMode.Write)) 
    { 
     using (GZipStream gs = new GZipStream(cs, CompressionMode.Compress)) 
     { 
      BinaryFormatter bf = new BinaryFormatter(); 
      bf.Serialize(gs, _instance); 
     } 
    } 
} 

Deserialization:

using (Stream s = File.OpenRead(PathName)) 
{ 
    RijndaelManaged rm = new RijndaelManaged(); 
    rm.Key = CryptoKey; 
    rm.IV = CryptoIV; 
    using (CryptoStream cs = new CryptoStream(s, rm.CreateDecryptor(), CryptoStreamMode.Read)) 
    { 
     using (GZipStream gs = new GZipStream(cs, CompressionMode.Decompress)) 
     { 
      BinaryFormatter bf = new BinaryFormatter(); 
      _instance = (Storage)bf.Deserialize(gs); 
     } 
    } 
} 

नोट: यदि आप CryptoStream उपयोग करते हैं, यह थोड़े महत्वपूर्ण है कि आप श्रृंखला (अन) ज़िप करने और (डी) सही इस तरह से crypting है, क्योंकि एन्क्रिप्शन आपके डेटा से शोर बनाता है इससे पहले कि आप अपना एन्ट्रॉपी खोना चाहेंगे।

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