2012-06-26 16 views
7

मैं निर्देशिका आकारों की गणना करने की कोशिश कर रहा हूं जो लोड को विभाजित करता है ताकि उपयोगकर्ता गिनती प्रगति देख सके। मैंने सोचा कि ऐसा करने का एक तार्किक तरीका सबसे पहले निर्देशिका पेड़ बनाना होगा, फिर सभी फ़ाइलों की लंबाई गिनती एक ऑपरेशन करें।निर्देशिका आकारों की गणना

अप्रत्याशित रूप से मेरे लिए जो चीज आती है वह यह है कि समय (डिस्क I/O) निर्देशिका वृक्ष बनाने से आता है, तो FileInfo[] पर जाकर लगभग तुरंत डिस्क I/O के साथ आता है।

मैं तुलना में दोनों Directory.GetDirectories() साथ की कोशिश की है, बस निर्देशिका नाम के तार का एक वृक्ष बनाने, और एक DirectoryInfo वस्तु का उपयोग कर, और दोनों तरीकों अभी भी मैं/हे समय के थोक (पढ़ने निश्चित रूप से MFT) ले प्रत्येक निर्देशिका में फ़ाइलों के लिए सभी FileInfo.Length पर जाने के लिए।

मुझे लगता है कि पेड़ को महत्वपूर्ण बनाने के लिए I/O को कम करने का कोई तरीका नहीं है, मुझे लगता है कि मैं सोच रहा हूं कि इस ऑपरेशन को और अधिक फ़ाइलों पर जाने की तुलना में काफी अधिक समय क्यों लगता है?

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

संपादित करें: Repository for this code

+0

मैंने निर्देशिका आकार की गणना के साथ भी संघर्ष किया है। मैंने ठीक किया है जो आपने किया है। कोशिश की> fileInfo [] और फिर> Directory.GetDirectories()। लेकिन मुझे अभी भी किसी भी बेहतर तरीके से पता नहीं है। –

+0

आप कह रहे हैं कि GetDirectories() को कॉल करना काफी समय लगता है? मैंने इसे नहीं देखा है लेकिन फिर से, मैंने कभी भी बड़ी संख्या में निर्देशिकाओं के साथ ऐसा नहीं किया है। इसके अलावा, अगर आप इसकी रिकर्सिव परवाह करते हैं तो आप परवाह क्यों करेंगे? यह एक पुनरावर्ती कार्य है और आप कभी भी इतनी घोंसला वाली निर्देशिका नहीं कर पाएंगे कि आप ढेर को उड़ा देंगे। –

+0

देखें http://stackoverflow.com/questions/468119/whats-the-best-way-to-calculate-the-size-of-a-directory-in-net –

उत्तर

4

आप समानांतर फैशन में निर्देशिका आकार गणना चलाने के लिए Parallel.ForEach उपयोग कर सकते हैं। आप GetDirectories प्राप्त कर सकते हैं और प्रत्येक नोड पर समानांतर चला सकते हैं। आप आकार का ट्रैक रखने और उपयोगकर्ता को प्रदर्शित करने के लिए एक चर का उपयोग कर सकते हैं। प्रत्येक समानांतर गणना एक ही चर पर वृद्धि होगी। यदि समानांतर निष्पादन के बीच सिंक्रनाइज़ करने के लिए आवश्यक लॉक() का उपयोग करें।

+0

आपको इसे कोड करना चाहिए ताकि केवल अन-संबंधित निर्देशिका समानांतर हों और इसके आगे लॉक करने का कोई कारण नहीं होगा।हालांकि अधिकांश डिस्क के साथ मुझे यकीन नहीं है कि समानांतरता आपको क्या हासिल करेगी। डिस्क IO प्रकृति में तुल्यकालिक लगता है। जो भी आप वास्तव में समानांतर बना सकते हैं वह योगों का वास्तविक जोड़ है जो नगण्य होना चाहिए –

+2

आप एसएसडी के साथ समानांतर आईओ प्राप्त कर सकते हैं ... –

+0

@JasonMalinowski वास्तव में ... मुझे नहीं पता था। क्या अधिकांश ओएस जानते हैं कि इसका लाभ कैसे लें? मुझे पता था कि यह कोई आगे बढ़ने वाले हिस्सों के कारण बहुत तेज़ नहीं था, मुझे पता नहीं था कि यह समानांतर भी सक्षम है। –

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

  • कोई संबंधित समस्या नहीं^_^