2010-08-04 13 views
6

के I/O को सीमित कर सकता हूं मैंने एक ऐप बनाया जो हजारों फ़ाइलों पर काम करता है, फिर इन फ़ाइलों की संशोधित प्रतियों को डिस्क पर लिखता है। मैं थ्रेडपूल का उपयोग कर रहा हूं लेकिन यह बहुत सारे धागे पैदा कर रहा था कि पीसी 260 कुल उत्तरदायी नहीं हो रहा था), इसलिए मैंने अधिकतम 250 से 50 के डिफ़ॉल्ट से अधिकतम बदल दिया, इस समस्या को हल किया गया (ऐप केवल 60 धागे कुल मिलाकर) अब जब फाइलें इतनी जल्दी तैयार हो रही हैं, तो यूआई को उस बिंदु पर बांध कर जहां पीसी उत्तरदायी नहीं है।क्या मैं अपने सी # एप

क्या I/O की मात्रा को सीमित करने का कोई तरीका है - मेरा मतलब है, मुझे फ़ाइलों पर काम करने के लिए 50 धागे का उपयोग करना पसंद है, लेकिन जब वे संसाधित होते हैं तो 50 धागे लिखते हैं। यदि मैं इसे से रख सकता हूं तो मैं फ़ाइलों के भाग के लेखन को पुन: आर्किटेक्ट नहीं करना चाहूंगा - मैं उम्मीद कर रहा था कि मैं इस पूल से थ्रेड्स I/O (एक साथ) की मात्रा को सीमित कर सकता हूं।

+1

आप कहते हैं "फाइलें इतनी जल्दी तैयार हो रही हैं, यह यूआई को बांध रही है"। प्रत्येक बार एक फ़ाइल तैयार होने पर यूआई अपडेट किया जाता है? यदि हां, तो क्या यह असली मुद्दा हो सकता है ?? –

उत्तर

7

संख्या को सीमित करने के लिए एक सेमफोर का उपयोग करें। एक साथ डिस्क पर लिखने के इच्छुक धागे के।

http://msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx

धागे उस संख्या को सीमित कर सकते हैं कि पहुँच एक संसाधन या संसाधनों समवर्ती के पूल।

+0

बहुत बढ़िया, धन्यवाद – schmoopy

4

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

एक और सीधा दृष्टिकोण एक एकल धागा होगा जिसका काम फाइलों में पढ़ना है, और उसके बाद डेटा को अवरुद्ध कतार में जोड़ें (उदाहरण के लिए ConcurrentQueue देखें), इस बीच कई कार्यकर्ता धागे हैं जो प्रतीक्षा कर रहे हैं कतार में फ़ाइल डेटा (उदाहरण के लिए प्रोसेसर \ कोर की संख्या के बराबर संख्या धागे)। ये कार्यकर्ता धागे कतार के माध्यम से अपना रास्ता घुमाएंगे क्योंकि आइटम जोड़े जाते हैं, और जब यह खाली होता है तो ब्लॉक करें। जब एक कार्यकर्ता धागा काम के एक टुकड़े को खत्म करता है, तो वह इसे किसी अन्य अवरुद्ध कतार में जोड़ सकता है जिसे पाठक धागे या समर्पित लेखक थ्रेड द्वारा निगरानी की जा रही है। इसका काम फाइलों को लिखना है।

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

इसके अलावा, यदि आईओ वास्तव में समस्या है (और बड़ी संख्या में धागे एक दूसरे से लड़ रहे हैं), तो आप अपनी फाइल पढ़ने और थ्रेड लिखने में सीमित करने के लिए कुछ विराम (जैसे थ्रेड। सो) डाल सकते हैं वे बहुत काम करते हैं।

अद्यतन

शायद यह समझाने के लायक क्यों वहाँ इतने सारे धागे पहली जगह में उत्पन्न किया जा रहा है है। यह थ्रेडपूल उपयोग के लिए एक अपरिवर्तनीय मामला है, और क्यूइंग वर्कटाइम के आसपास केंद्रित है जिसमें आईओ का एक घटक है।

थ्रेडपूल अपनी कतार से कार्य आइटम निष्पादित करता है और मॉनीटर करता है कि काम करने वाले सामान कितने समय तक चल रहे हैं। यदि वर्तमान में वर्कटाइम निष्पादित करने में काफी समय लग रहा है (मुझे लगता है कि स्मृति से आधे सेकेंड) तो यह पूल में अधिक धागे जोड़ना शुरू कर देगा क्योंकि ऐसा लगता है कि यह कतार को त्वरित रूप से संसाधित करेगा। हालांकि, यदि अतिरिक्त समवर्ती वर्कटाइम एक साझा डिस्क के खिलाफ काम IO भी कर रहे हैं, तो डिस्क का प्रदर्शन वास्तव में कम हो जाएगा, जिसका अर्थ है कि वर्कटाइम निष्पादित करने में और अधिक समय लगेगा। क्योंकि वर्कटाइम निष्पादित करने में अधिक समय ले रहे हैं, थ्रेडपूल अधिक धागे जोड़ता है। यह degenerative मामला है, जहां प्रदर्शन और भी बदतर हो जाता है क्योंकि अधिक धागे जोड़े जाते हैं।

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

+0

थ्रेडपूल प्रत्येक फ़ाइल की सामग्री के आधार पर जटिल गणना करता है और थ्रेडपूल का उपयोग करके प्रक्रिया के इस हिस्से को थक जाता है :-) – schmoopy

+0

@schmoopy मुझे यकीन नहीं है कि मैं आपकी टिप्पणी समझता हूं। मैं थ्रेडपूल और फ़ाइल प्रसंस्करण से परिचित हूं, इसलिए मैंने आपके प्रश्न का उत्तर दिया। विस्तार से मैं जोड़ सकता हूं ... –

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