2011-07-02 15 views
12

थोड़ा और विस्तार: हम पहले से ही ज़िपमैप्स, ज़ीप्लिस्ट, आदि का सबसे अधिक लाभ लेने की कोशिश कर रहे हैं, और मैं सोच रहा हूं कि ये प्रस्तुतियां पहले ही संपीड़ित हैं या सिर्फ क्रमशः हैंश और सूचियां हैं; संपीड़न मेमोरी उपयोग को कम करता है?रेडिस में डालने से पहले तारों को संपीड़ित करना - क्या यह समझ में आता है?

इसके अलावा, ऐप सर्वर परत पर संपीड़न ओवरहेड कम नेटवर्क उपयोग से ऑफ़सेट हो जाता है? StackOverflow's experience सुझाव देता है कि यह कोई अन्य राय है?

संक्षेप में, क्या यह समझ में आता है - दोनों छोटे और लंबे तारों के लिए?

उत्तर

2

रेडिस और क्लाइंट आम तौर पर आईओ बाध्य होते हैं और आईओ लागत आमतौर पर अनुरोध/उत्तर अनुक्रम के संबंध में कम से कम 2 ऑर्डर की परिमाण होती है। छोटे पेलोड आपको उच्च थ्रूपुट और कम लेटेंसी देंगे।

मुझे विश्वास नहीं है कि कोई कठोर और तेज़ नियम हैं: cost of compression << IO gains। आपको इसे बेंच करना चाहिए और निचले बाउंड को सेट करने में पसीना स्थान ढूंढना चाहिए, लेकिन आपके नेटवर्क के MTU निचले बाउंड के लिए एक खराब प्रारंभिक बिंदु नहीं है।

+1

मुझे यह बेंचमार्क मिला है (http://dev.mensfeld.pl/2013/04/compressing-large-data-sets-in-redis-with-gzip-ruby-test-case/) बहुत उपयोगी और [इन अतिरिक्त विचारों] (http://nosql.mypopescu.com/post/46926679137/compressing-large-data-sets-in-redis-with-gzip) साथ ही साथ। – robert4

14

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

+0

तो, लगभग 10 के बारे में कुछ ऐसा करने के लिए, आप कहते हैं कि संपीड़ित न करें - क्या मैं सही हूँ? एक विशिष्ट मामले के बारे में, जहां आपके पास बहुत सारी सामग्री है जो लगातार JS से 2 से 5K है, कम-स्तरीय gzipping को कम से कम 2 के कारक द्वारा स्मृति पदचिह्न को स्लैश करना चाहिए, विशेष रूप से यदि वे ज़िप्मैप्स के रूप में प्रदर्शित होते हैं ? या मैं गलत – Hristo

+0

हूं यदि आप दो के कारक द्वारा अपने तारों का आकार घटा सकते हैं, तो हर तरह से, आपको उन्हें संपीड़ित करना चाहिए। मैं जो कह रहा हूं वह यह है कि यह बिल्कुल निश्चित नहीं है कि आपको छोटे तारों पर पर्याप्त संपीड़न मिलेगा। तारों की सामग्री के आधार पर, 2-5K बहुत कम हो सकता है।एक्सएमएल दोहराए गए टैग नामों के कारण बहुत अच्छी तरह से संपीड़ित होता है, लेकिन जेपीईजी, जीआईएफ या पीएनजी में छवि डेटा पहले से संपीड़ित होने के बाद से संपीड़ित नहीं होता है, अन्य प्रकार के डेटा में अन्य गुण होते हैं। टेस्ट लोडिंग असंपीड़ित डेटा और मेमोरी उपयोग ('redis-cli info | grep used_memory') और फिर संकुचित डेटा के साथ देखें। – Theo

6

अच्छा संपीड़न प्राप्त करने के लिए एक व्यावहारिक तरीका भी बहुत छोटे तार के लिए, नहीं है (50 बाइट्स!) -

यदि आपका मान कुछ हद तक एक दूसरे के समान हैं - उदाहरण के लिए, वे कुछ संबंधित की JSON निरूपण कर रहे हैं वस्तुओं के वर्ग - आप कुछ उदाहरण पाठ के आधार पर एक कंप्रेसर/डिकंप्रेसर शब्दकोश का प्रीकंप्यूट कर सकते हैं।

यह जटिल लगता है, लेकिन यह अभ्यास में आसान है - और इसे संभालने के लिए सही रैपर कोड के साथ अभी भी सरल है।

यहाँ एक अजगर कार्यान्वयन है:

https://github.com/internetarchive/openlibrary/blob/master/openlibrary/utils/compress.py

और यहाँ तार की एक विशेष वर्ग को संपीड़ित करने के लिए एक आवरण है: (लघु JSON रिकॉर्ड)

https://github.com/internetarchive/openlibrary/blob/master/openlibrary/utils/olcompress.py

एक पकड़: यह करने के लिए कुशलतापूर्वक, आपकी संपीड़न लाइब्रेरी को आंतरिक स्थिति 'क्लोनिंग' का समर्थन करना चाहिए। (पायथन लाइब्रेरी करता है) आप संपीड़न करते समय उदाहरण पाठ को प्रीपेड करके कुछ ऐसा ही कार्यान्वित कर सकते हैं, लेकिन इसका मतलब अतिरिक्त गणना लागत का भुगतान करना है।

इस अद्भुत चाल के लिए हल करने के लिए धन्यवाद।

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

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