2010-11-10 10 views
6

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

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

foreach (string directory in directories) { ... } 

Parallel.ForEach(directories, (directory) => { ... }) 

के लिए, लेकिन मुझे लगता है कि यह भी कई कार्य बनाने और खुद को समुद्री मील में मिल सकता है, खासकर जब वापस एक यूआई धागा पर प्रेषण करने के लिए कोशिश कर रहा। मुझे यह भी लगता है कि कार्यों की संख्या अप्रत्याशित है और यह इस कार्य को लंबित करने का एक प्रभावी तरीका नहीं है (क्या यह एक शब्द है?)।

क्या किसी ने सफलतापूर्वक ऐसा कुछ किया है? ऐसा करने में आपके पास क्या सलाह है?

+0

+1 मुझे खुशी है जॉन पर 16 सीपीयू बाध्य धागे चलाने का प्रयास सिद्धांत को दूर कर दिया क्योंकि मैं भी सोच रहा था कि यह एक अच्छा उम्मीदवार होगा। ऐसा लगता है कि माइक्रोसॉफ्ट इसे सही तरीके से भी नहीं कर सकता है: http://msdn.microsoft.com/en-us/library/ff477033.aspx -> नीचे टिप्पणी पढ़ें :) –

उत्तर

15

नहीं, यह समांतरता ठीक के लिए एक अच्छा उम्मीदवार की तरह नहीं लगता है क्योंकि आईओ धीमा है। आप डिस्कबाउंड होने जा रहे हैं। मान लीजिए कि आपको केवल एक डिस्क मिल गई है, आप वास्तव में एक ही समय में कई अलग-अलग स्थानों की तलाश नहीं करना चाहते हैं।

यह तेजी से बाहर पानी प्राप्त करने के लिए आदेश में एक ही नल के लिए कई नली संलग्न करने की कोशिश की तरह एक सा है - या एक सिंगल कोर :)

+0

यह समझ में आता है। क्या यह एक थ्रेड होने के लिए सभी डिस्क-आईओ और कई अन्य फाइलों को पार्स करने के लिए और अधिक फायदेमंद होगा? – rein

+3

@rein: यदि डेटा को पार्स करने में कोई महत्वपूर्ण समय लगता है, तो यह सिंक्रोनस रीडिंग से अलग से ऐसा करने का अर्थ हो सकता है, हां। हालांकि, यदि आईओ सबसे महत्वपूर्ण बाधा है, तो यह वास्तव में आपको अधिक लाभ नहीं दे सकता है - लेकिन कोड को और अधिक जटिल बनाते हैं। आप एक थ्रेड सिंक्रोनस आईओ कर रहे हैं और सभी पार्सिंग करने के लिए डेटा को दूसरे थ्रेड में सौंप सकते हैं। प्रयोग करने लायक है। –

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