2010-10-12 1 views
8

में एक अलग थ्रेड पर फास्ट डेटा रिकॉर्डिंग/लॉगिंग हम एक ऐसे अनुप्रयोग को विकसित कर रहे हैं जो लगातार कई बाहरी हार्डवेयर उपकरणों से डेटा पढ़ता है। बाहरी हार्डवेयर कॉन्फ़िगरेशन के आधार पर डेटा दर 0.5 एमबी - 10 एमबी/सेकंड के बीच है।सी #

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

हम इस उद्देश्य के लिए एक सिंक्रनाइज़ कतार का उपयोग करने के बारे में सोच रहे हैं। लेकिन हमने सोचा कि इस पहिया का आविष्कार पहले से ही किया जाना चाहिए, इसलिए हमें कुछ इनपुट के लिए एसओ समुदाय से पूछना चाहिए।

उन चीजों पर कोई सुझाव या टिप्पणियां जिन्हें हमें देखना चाहिए, उनकी सराहना की जाएगी।

उत्तर

2

मैं बहुत विश्वास है कि अपने कतार काफी ठीक हो जाएगा हूँ कोशिश की है। लेकिन सुनिश्चित करें कि आप स्मृति आवंटन/डीलोकेशन के साथ लॉगिंग प्रक्रिया को ओवरहाल न करने के लिए डेटा को संग्रहीत/पुनर्प्राप्त करने की कुशल विधि का उपयोग करते हैं। मैं कुछ प्री-आवंटित मेमोरी बफर के लिए जाऊंगा, और इसे गोलाकार कतार के रूप में उपयोग करूंगा।

+0

डैनियल, क्या आपको लगता है कि हम इस उद्देश्य के लिए .NET कतारों का उपयोग कर सकते हैं? हम डेटा को पॉइंटर्स स्टोर करने के लिए ConcurrentQueue का उपयोग करने के बारे में सोच रहे हैं, लेकिन लॉगिंग शुरू करने से पहले डेटा के लिए स्मृति आवंटित करें। – SomethingBetter

+0

आप किस प्रकार का डेटा लॉग करते हैं? वास्तव में, सरल बाइट्स, मेरा प्रश्न इस बारे में है कि यदि डेटा को पैकेट में आसानी से क्रमबद्ध किया जा सकता है और अनुक्रमिक रूप से पढ़ा जा सकता है। आप निम्न स्तर पर हैं, निम्न स्तर पर रहें। –

-1

आप MSMQ

+0

मुझे लगता है कि एमएसएमक्यू यहां मदद नहीं करेगा, क्योंकि हमारे पास इतना डेटा है, और एमएसएमक्यू किसी भी तरह का उच्च स्तरीय एपीआई है जो सीपीयू का उपभोग करता है, भले ही यह बहुत कम हो। –

2

आपको

उदाहरण के लिए कतार की आवश्यकता हो सकती है। कोड

protected Queue<Byte[]> myQ; 
or 
protected Queue<Stream> myQ; 

//when u got the content try 
myQ.Enque(...); 

और कतार पॉप

// another thread 
protected void Loging(){ 
while(true){ 
    while(myQ.Count > 0){ 
    var content = myQ.Dequeue(); 
    // save content 
    } 
    System.Threading.Thread.Sleep(1000); 
} 
} 
+0

इस मामले में हमें लॉकिंग तंत्र को स्वयं लागू करना होगा। उपरोक्त कोड धागा-सुरक्षित प्रतीत नहीं होता है। – SomethingBetter

+0

.NET 4.0 में एक ConcurrentQueue है, जो कतार का उपयोग करते समय थ्रेड-सुरक्षित – SomethingBetter

+0

है, आपको थ्रेड सुरक्षित के बारे में चिंता करने की ज़रूरत नहीं है। जब आप कतार में तत्व प्राप्त करना चाहते हैं, तो आप बस डेक्यू करें। और कोई क्रॉस थ्रेड प्रसंस्करण एक ही ऑब्जेक्ट – Bonshington

3

मैं क्या करना होगा एक और धागा का उपयोग क्या क्या श्री 888 करता है का एक संयोजन।

मूल रूप से आपके पास 2 पृष्ठभूमि कर्मचारी हैं, हार्डवेयर डिवाइस से पढ़ता है। वह डिस्क जो डेटा को डिस्क लिखता है।

हार्डवेयर पृष्ठभूमि कार्यकर्ता:
Queue<> में हार्डवेयर से डेटा पर chucks जोड़ता है। जो कुछ भी प्रारूप में आप उस में की है।

लिखें पृष्ठभूमि कार्यकर्ता
अगर जरूरत डेटा पार्स करता है और डिस्क पर उदासीनता।

यहां पर विचार करने की एक बात यह है कि हार्डवेयर से डेटा को डेटा आयातक के रूप में तेजी से प्राप्त करना है?
यदि हां, तो मेरे पास मूल रूप से एक लूप में 100 एमएमएस या 10 एमएम नींद के साथ लिखने के लिए ब्रेक में परीक्षण होगा, जिसमें जांच के साथ क्यूई डेटा है या नहीं।
यदि नहीं, तो मैं इसे या तो एक अनुकरणीय राशि सो सकता हूं (यह मानते हुए कि आपके हार्डवेयर से जो गति आप प्राप्त करते हैं, उसे समय-समय पर बदलते हैं) और केवल डिस्क पर लिखते हैं जब उसके पास लगभग 50-60 एमबी डेटा होता है। मैं इसे इस तरह से करने पर विचार करता हूं क्योंकि आधुनिक हार्ड ड्राइव लगभग 60 एमबी पीआर सेकेंड लिख सकते हैं (यह एक डेस्कटॉप हार्ड ड्राइव है, आपका उद्यम एक बार बहुत तेज़ हो सकता है) और छोटे चक्स में लगातार डेटा लिखना आईओ बैंडविड्थ का अपशिष्ट है।

+0

विचार के लिए धन्यवाद। हां, मुझे लगता है कि हमें डेटा बफर करना चाहिए और इसे बड़े हिस्सों में लिखना चाहिए। – SomethingBetter

0

मैं एक ऐसी ही स्थिति है, मेरे मामले में मैं एक asynchrounous lockfree कतार एक LIFO तुल्यकालिक वस्तु मूल रूप से धागे कि LIFO में सिंक ऑब्जेक्ट सेट, जबकि अन्य धागे 'मजदूरों के समन्वयन रीसेट कतार में लिखने के साथ इस्तेमाल किया है LIFO में ऑब्जेक्ट हमने थ्रेड के बराबर सिंक ऑब्जेक्ट्स की संख्या तय की है। एलआईएफओ का उपयोग करने का कारण यह है कि कम से कम धागे चलने और कैश सिस्टम के बेहतर उपयोग को रखने के लिए।