2011-08-24 16 views
5

से संबंधित गणना यह तकनीकी "कैसे-कैसे" या "सर्वोत्तम दृष्टिकोण" प्रश्न है।सी # LINQ और बड़े डेटासेट

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

डेटा को 'इन-मेमोरी' सूची में प्राप्त करना कोई समस्या नहीं है क्योंकि हम एनएचबीर्नेट को हमारे ओआरएम के रूप में उपयोग करते हैं और यह डेटाबेस से डेटा पुनर्प्राप्त करने का एक उत्कृष्ट काम करता है। सलाह जो मैं चाहता हूं वह है कि हम डेटा की परिणामी सूची पर गणना कैसे कर सकते हैं।

आदर्श रूप से मैं प्रत्येक आंकड़े, अधिकतम वैल्यू(), औसत वैल्यूयूंड 100(), MoreComplicatedStatistic() इत्यादि के लिए एक विधि बनाना चाहता हूं। बेशक प्रत्येक विधि के लिए आवश्यक चर पारित करना और परिणाम को वापस करना। यह दृष्टिकोण इकाई को एक हवा का परीक्षण भी करेगा और हमें उत्कृष्ट कवरेज प्रदान करेगा।

यदि हम प्रत्येक गणना के लिए LINQ क्वेरी करते हैं तो प्रदर्शन प्रदर्शन होगा या प्रत्येक स्टैटिस्टिक विधि को जितनी संभव हो सके उतनी LINQ क्वेरी में समेकित किया जाना चाहिए। उदाहरण के लिए, यह औसतValueBelow100 नामक विधि में डेटा की सूची को पास करने के लिए अधिक समझ नहीं लेता है और फिर डेटा की पूरी सूची को किसी अन्य विधि में पास कर देता है औसत ValueBelow50 जब वे प्रभावी रूप से एक LINQ क्वेरी के साथ निष्पादित किए जा सकते हैं।

हम प्रदर्शन को त्याग किए बिना उच्च स्तर की ग्रैन्युलरिटी और अलगाव कैसे प्राप्त कर सकते हैं?

कोई सलाह ... क्या सवाल पर्याप्त स्पष्ट है?

+4

सबसे अच्छा तरीका डेटाबेस के खिलाफ प्रश्नों को निष्पादित करना होगा जहां आपको वास्तव में प्रदर्शन –

+0

प्रदर्शन सुधारने के लिए इंडेक्स का लाभ होगा? इसलिए 'इन-मेमोरी' प्रक्रिया की बजाय हम डेटाबेस से पूछताछ करना बेहतर होगा। कुछ गणना काफी जटिल हैं इसलिए मुझे पूरी तरह से यकीन नहीं है कि यह सबसे अच्छा तरीका होगा। – Rowen

+1

अधिकांशतः डेटाबेस तेज़ी से –

उत्तर

1

गणना की जटिलता के आधार पर, डेटाबेस में ऐसा करना सबसे अच्छा हो सकता है। यदि यह संकेतक जटिल है कि आपको इसे वस्तुओं के रूप में लाने की आवश्यकता है और उस ओवरहेड को घेरना है, तो आप अपने परिणाम सेट पर एकाधिक पुनरावृत्तियों से बच सकते हैं। आप कुल उपयोग करने पर विचार करना चाह सकते हैं। यदि चर्चा हो तो http://geekswithblogs.net/malisancube/archive/2009/12/09/demystifying-linq-aggregates.aspx देखें। आप यूनिट को प्रत्येक अलग से अलग परीक्षण करने में सक्षम होंगे, लेकिन फिर (संभावित रूप से) एक एकल पुनरावृत्ति के भीतर कई समेकित प्रोजेक्ट को सक्षम कर सकते हैं।

1

मैं इस बात से सहमत नहीं हूं कि यह डेटाबेस में सब कुछ करने के लिए सबसे अच्छा है।

अच्छी तरह लिखित लिंक क्वेरीज़ के परिणामस्वरूप डेटाबेस के विरुद्ध अच्छे SQL क्वेरी निष्पादित किए जाएंगे, जो पर्याप्त प्रदर्शन के अनुसार अच्छा होना चाहिए (यदि आप dwh सामान नहीं करने वाले हैं)। यह माना जा रहा है कि आप NHibernate के लिए लिंक प्रदाता का उपयोग कर रहे हैं और ऑब्जेक्ट्स के लिए लिंक नहीं।

यह अच्छा लग रहा है, आप इसे आसानी से बदल सकते हैं और अपने व्यापार तर्क को एक ही स्थान पर रख सकते हैं।

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

क्या कोई प्रदर्शन हिट होगा? हाँ, आप कुछ मिलीसेक खो सकते हैं, लेकिन क्या यह आपके तर्क को अलग करने के लिए आपको कितनी कीमत चुकानी पड़ेगी?

+0

मैं डेटाबेस में यह सब करने का सुझाव नहीं दे रहा था। मैं सिर्फ स्मृति में सभी डेटा प्राप्त करने के खिलाफ सलाह दे रहा था और फिर प्रदर्शन कर रहा था कि उसके खिलाफ पूछताछ के लिए लिंकक प्रभावी ढंग से क्या होगा। –

0

"मैं प्रत्येक सांख्यिकीय" चिंता के लिए एक विधि बनाना चाहता हूं, मैं आपको एक प्रकार की सांख्यिकीविद वर्ग बनाने का सुझाव दूंगा।यहाँ विचार व्यक्त करने के लिए कुछ छद्म कोड है:

class Statistician 
{ 
    public bool MustCalculateFIRSTSTATISTIC { get; set; } // Please rename me! 
    public bool MustCalculateSECONDSTATISTIC { get; set; } // Please rename me! 

    public void ProcessObject(object Object) // Replace object and Rename 
    { 
     if (MustCalculateFIRSTSTATISTIC) 
      CalculateFIRSTSTATISTIC(Object); 

     if (MustCalculateFIRSTSTATISTIC) 
      CalculateSECONDSTATISTIC(Object); 
    } 

    public object GetFIRSTSTATISTIC() // Replace object, Rename 
    { /* ... */ } 
    public object GetSECONDSTATISTIC() // Replace object, Rename 
    { /* ... */ } 

    private void CalculateFIRSTSTATISTIC(object Object) // Replace object 
    { /* ... */ } 
    private void CalculateSECONDSTATISTIC(object Object) // Replace object 
    { /* ... */ } 
} 

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

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