2011-03-31 11 views
10

मैं एक आवेदन (सी #, WPF) कि लाइव सर्वर से स्ट्रीमिंग डेटा के साथ कई वित्तीय चार्ट प्रदर्शित करता है। मेमोरी में एकत्र किया गया डेटा थोड़ा बड़ा हो सकता है, और मैं डिस्क पर कोई डेटा नहीं रखना चाहता हूं।क्या मुझे बेहतर प्रदर्शन के लिए इन-मेमोरी सी # ऑब्जेक्ट्स को संपीड़ित करना चाहिए?

के बाद से ऐतिहासिक डेटा ही नहीं बदलता है, लेकिन केवल करने के लिए जोड़ा है, यह समझ कर देगा कि कुछ में डेटा (जो एक संग्रह वस्तु में संग्रहीत है) संपीड़ित प्रारूप रखने के लिए?

क्या यह संभव है और क्या कोई इसके लिए एक अच्छा अभ्यास करने की सिफारिश कर सकता है?

अद्यतन

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

+1

जब आप "बड़े" कहते हैं, तो आपका कितना बड़ा मतलब है? – HABJAN

+0

@ हैबजान 10 एमबी या 100 वां हो सकता है, क्यों? असल में यह डेटा की मात्रा को संभालने के लिए "समस्या" नहीं है, लेकिन मैं ऐप की मेमोरी पदचिह्न को जितना संभव हो उतना छोटा – Saul

+0

रखना चाहता हूं, मैं दृढ़ता से औद्योगिक समाधान का उपयोग करने की सलाह देता हूं। एक उदाहरण केडीबी डेटाबेस है जो मेमोरी स्टोरेज के रूप में महान है। – Andrey

उत्तर

13

संपीड़न और डिकंप्रेसरिंग आपके एप्लिकेशन को धीमा कर देगा ताकि प्रदर्शन (गति) के लिए यह एक अच्छा विकल्प न हो। संपीड़न केवल तब उपयोगी होता है जब आप उपलब्ध स्मृति के बारे में चिंतित होते हैं। डेटा को एक अस्थायी फ़ोल्डर में स्टोर/स्वैप करना आसान हो सकता है।

प्रदर्शन की कुंजी को मापने है। जब आप संख्याओं को क्रंच करते हैं तो केवल कार्रवाई करें।

+0

@Erno लेकिन एक बार प्रदर्शित होने पर, पुराने डेटा तक शायद ही कोई पहुंच है, तो यहां प्रदर्शन मूल्य क्या है? – Saul

+0

आप स्मृति में डेटा को संपीड़ित करने का सुझाव दे रहे थे। संपीड़ित डेटा प्रदर्शित करने के लिए आपको इसे डिकंप्रेस करना होगा। इसमें समय लगता है। निश्चित रूप से जब आपने इसे प्रदर्शित किया है और अब इसे एक्सेस करने की आवश्यकता नहीं है तो आप इसे संकुचित कर सकते हैं लेकिन क्यों न केवल इससे छुटकारा पाएं क्योंकि आपको इसकी आवश्यकता नहीं है? फिर पहले मापें, फिर गणित करना शुरू करें और सलाह मांगें। तब तक हम अनुमान लगा रहे हैं। –

+0

@ एर्नो धन्यवाद, मैं मापूंगा, वर्तमान में मुझे अन्य अनुप्रयोगों से इस समस्या का पता है। चर्चा के लिए: मैं इसे फेंकना नहीं चाहता क्योंकि मुझे इसे एक्सेस करने की आवश्यकता होगी, और मैं इसे फिर से डाउनलोड नहीं करना चाहता हूं। जब मैं इसे थूग तक पहुंचता हूं, तो मैं देरी की कीमत का भुगतान कर सकता हूं (लेकिन बैंडविड्थ नहीं)। मैंने सोचा कि चार्ट को एक बार प्रस्तुत करना, डेटा को संपीड़ित करना, और उसके बाद चार्ट को नए डेटा के साथ अपडेट करना है। – Saul

6

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

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

संपीड़न System.IO.Compression में कक्षाओं के माध्यम से किया जा सकता है, और काफी आसान है। इन कक्षाओं, सामान्य रूप में, बहुत अच्छा प्रदर्शन नहीं करते हैं, हालांकि, तो आप भी एक तीसरे पक्ष के विकल्प, DotNetZip के रूप में इस तरह के विचार कर सकते हैं।

+0

जैसा कि मैंने एर्नो को लिखा था, मैं कभी-कभी इस डेटा का उपयोग कभी-कभी करता हूं, कभी-कभी त्वरित प्रतिक्रिया की आवश्यकता नहीं होती है। मैं इसे फेंकना नहीं चाहता क्योंकि तब मुझे इसे हर बार डाउनलोड करना होगा और बैंडविड्थ अधिक महंगा होगा। – Saul

+0

@ सॉल: फिर डिस्क-आधारित कैश संभावित रूप से उचित विकल्प की तरह दिखता है। संपीड़न आपको स्मृति की एक टन बचाने की संभावना नहीं है, लेकिन इसमें काफी उच्च CPU लागत होगी ... –

+0

यदि आप .NET 4.0 का उपयोग कर रहे हैं, तो मैं मेमोरी मैप की गई फ़ाइलों का उपयोग करके ऐतिहासिक डेटा संग्रहीत करने की अनुशंसा करता हूं। डेटा प्राप्त करने के लिए आपको एक पूरी फ़ाइल पढ़ने की आवश्यकता के बिना वीएमएम डिस्क पर फ़ाइलों के माध्यम से स्थानांतरित कर सकता है। –

1

यह प्रदर्शन और मेमोरी पदचिह्न के बीच एक व्यापार बंद है और यह भी आपके द्वारा उपयोग की जा रही डेटा संरचनाओं पर निर्भर करता है। "जेनेरिक" संपीड़न (यानी gzip, रन-लम्बाई एन्कोडिंग इत्यादि) कई प्रकार के डेटा के लिए समझ में नहीं आता है। अपने चार्ट के लिए अर्थात तुम सच में स्वतंत्र शेयर कीमतों को स्टोर करने की क्या ज़रूरत है या यदि आप बस डेल्टा मान संग्रहीत करके रह सकते हैं -

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

0

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

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

यह सब ध्यान में रखते हुए, .NET Gzip संपीड़न करने के लिए System.IO.Compression नामस्थान प्रदान करता है। अगर आपको संपीड़न की ज़रूरत है तो मैं वहां देखकर शुरू करूंगा।

0

यदि आप इसे स्वयं कोड करने के इच्छुक हैं, तो अंतरिक्ष-कुशल डेटा संरचनाएं मौजूद हैं जिन्हें डीकोडिंग/डिकंप्रेशन का उपयोग करने की आवश्यकता नहीं है। अपने नवीनतम ब्लॉग पोस्ट में Steve Hanov describes Succinct Data Structures। उनका उदाहरण एक संक्षिप्त त्रिभुज है लेकिन आपको अन्य वस्तुओं और संरचनाओं का प्रतिनिधित्व करने से रोक नहीं रहा है। उन्होंने कई वैकल्पिक कार्यान्वयन का हवाला दिया।

जाहिर है, यह एक आउट ऑफ़ द बॉक्स समाधान नहीं है। आपको यह तय करना होगा कि यह एक संक्षिप्त प्रतिनिधित्व बनाने और परीक्षण करने के प्रयास के लायक है या नहीं।

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

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