2011-04-14 13 views
6

परिदृश्य: डाटा प्राप्त टाइमस्टैम्प के साथ डेटाबेस के लिए लिखा है। मुझे कच्चे डेटा को टाइम स्टैंप के आधार पर प्राप्त क्रम में संसाधित करने की आवश्यकता है और इसे वापस डेटाबेस, अलग-अलग तालिका में लिखना है, फिर टाइमस्टैम्प के आधार पर ऑर्डर को बनाए रखना है।क्या कतार के प्रकार के समानांतर डाटा प्रोसेसिंग में उपयोग करने के लिए - सी # - नेट 4

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

मैं SortedList (मैनुअल ताला) और BlockingCollection साथ प्रयोग किया है। मैंने समांतर में प्रक्रिया के लिए दो दृष्टिकोणों का उपयोग किया है: समांतर। के लिए (ForEach) और TaskFactory.Task.StartNew।

डेटा की प्रत्येक इकाई कई कारकों के आधार पर प्रक्रिया के लिए परिवर्तनीय मात्रा ले सकती है। एक धागा अभी भी पहले डेटा बिंदु को संसाधित कर सकता है जबकि अन्य धागे प्रत्येक तीन या चार डेटापॉइंट्स के साथ किए जाते हैं, टाइमस्टैम्प ऑर्डर को गड़बड़ कर देते हैं।

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

इसी तरह की समस्या पर चर्चा करने वाले लेखों के किसी भी सुझाव और/या लिंक की अत्यधिक सराहना की जाती है।

+1

क्या आप शायद कुछ कोड जोड़ सकते हैं? – flesh

उत्तर

5

व्यक्तिगत रूप से, मैं कम से कम निवेश के लिए एक BlockingCollection<T> और परिणामों के लिए एक ConcurrentQueue<T> उदाहरण का उपयोग कर के साथ शुरू करने की कोशिश करेगा।

मैं परिणामों को संसाधित करने के लिए समानांतर लिंक का उपयोग करूंगा। अपनी प्रसंस्करण के दौरान आदेश को संरक्षित करने के लिए, आप PLINQ कथन पर AsOrdered() का उपयोग कर सकते हैं।

+0

के रूप में चिह्नित करना होगा, मुझे कॉल करना होगा। प्लिनक पर एक समानांतर() विधि, मुझे आइटमों का थ्रेड-सुरक्षित संग्रह देगी? या क्या मुझे खुद को लॉक करना चाहिए? – Dimitri

+0

@ डिमिट्री: AsParallel() एक आईनेमरेबल पर कॉल किया गया है, यह गणना सही ढंग से संभाल लेगी, लेकिन आपको डेटा को संसाधित करते समय आवश्यक आंतरिक लॉकिंग को संभालने की आवश्यकता है। –

+0

बहुत बहुत धन्यवाद। मैं इसे – Dimitri

2

क्या आपने PLINQ और AsOrdered() को माना है? आप जो हासिल करने की कोशिश कर रहे हैं उसके लिए यह सहायक हो सकता है। http://msdn.microsoft.com/en-us/library/dd460719.aspx

+0

लिंक के लिए धन्यवाद, लेकिन मुझे रीड कोपेसी के जवाब को उत्तर – Dimitri

0

हो सकता है कि आप इन बातों पर विचार किया है, लेकिन ...

क्यों न सिर्फ टाइमस्टैम्प डेटाबेस के लिए डेटाबेस में बाद सभी प्रसंस्करण धागे गुजरती हैं और फिर या तो जाने डेटाबेस आदेश कर सकते हैं या ठीक करने के आदेश है लौटा हुआ? एसक्यूएल स्टेटमेंट्स क्रमशः निष्पादित करने के लिए है?

PLINQ महान है, लेकिन मैं धागा तुल्यकालन आवश्यकताओं से बचने के लिए कोशिश करेगा और केवल डेटाबेस के लिए और अधिक आदेश डेटा पास यदि आप कर सकते हैं।

+0

का प्रयास करूँगा जब मैं एसक्यूएल कथन में ऑर्डरिंग का उपयोग करता हूं, लेकिन आउटपुट डेटा को थोक डालने का उपयोग करके डीबी पर वापस कॉपी नहीं किया जा सकता है, प्रत्येक बिंदु को व्यक्तिगत डालने के रूप में वापस जाना होगा और आईडी आगे के लिए एप्लिकेशन पर वापस लौटा दी जाएगी प्रसंस्करण। मैं जितना संभव हो सके एसक्यूएल पर तनाव को कम करना पसंद करूंगा – Dimitri

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