2013-10-24 8 views
5

मेरे पास एक प्रोजेक्ट है जो हर 5 मिनट में शेड्यूल किए गए कार्य के रूप में चलता है। अन्य चीजों के अलावा, परियोजना सैकड़ों छवियों के माध्यम से चलती है और उन्हें इस तरह से नेटवर्क ड्राइव पर कॉपी करती है।File.Copy() प्रदर्शन अगर फ़ाइल पहले से मौजूद हो सकती है

foreach (string file in Files) 
{ 
    string Control = Path.GetFileNameWithoutExtension(file); 
     File.SetAttributes(file, FileAttributes.Normal); 
     try 
     { 
      File.Copy(file, destinationFolder + "\\" + Control + @".pdf", false); 
     } 
     catch (Exception err) 
     { 
      Console.Writeline(err.ToString()); 
     } 
} 

पाठ्यक्रम की "झूठी" तर्क यह बताती है कि अगर यह पहले से मौजूद है तो फ़ाइल को ओवरराइट नहीं करना है।

क्या पहले से मौजूद फ़ाइल की जांच करने से पहले यह तेज़/बेहतर अभ्यास है और फ़ाइल केवल मौजूद नहीं है तो कॉपी कर रहा है? (नीचे देखें)

foreach (string file in Files) 
{ 
    if (File.Exists(destinationFolder + "\\" + ControlNumber + ".pdf") == false) 
    { 
     File.SetAttributes(file, FileAttributes.Normal); 
     File.Copy(file, destinationFolder + "\\" + ControlNumber + @".pdf"); 
    } 
} 

मेरा आंत मुझे बताता है कि पहला बेहतर तरीका है। हालांकि, मैं प्रोग्रामिंग के लिए अपेक्षाकृत नया हूं और यह जानना अच्छा लगेगा कि कौन सा बेहतर, तेज, अधिक व्यापक रूप से स्वीकार्य है, आदि ..

धन्यवाद!

संपादित करें: यह हो सकता है या पता है कि मैं करने के लिए कॉपी करने हूँ दूरस्थ ड्राइव/फ़ोल्डर छवि डेटा (छवियों के लाखों लोगों) के 4tb शामिल सहायक नहीं हो सकता है

+3

http://ericlippert.com/2012/12/17/performance-rant/ –

+0

यदि आप सभी मौजूदा फाइलों के पथ को टेक्स्ट या एक्सएमएल फ़ाइल में लिखते हैं तो बेहतर नहीं होगा, और उसके बाद जांचें पहले सूचीबद्ध करें, अगर यह उस सूची में नहीं है, तो निर्देशिका में कॉपी करें और फिर सूची में नई फ़ाइल जोड़ें? बस एक विचार :) –

+0

आपने 'फ़ाइलें' संग्रह कैसे बनाया? –

उत्तर

5

निम्नलिखित परिणामों के साथ एक स्थानीय ड्राइव पर इस परीक्षण किया गया:

1000 बार पता चल सके कि फ़ाइल मौजूद है, तो एक File.Copy कर अगर ऐसा नहीं होता है: अधिलेखित के साथ एक File.Copy कर

1000 बार 28.29 मिलीसेकेंड317.13 मिलीसेकेंड

निम्न परिणाम के साथ एक नेटवर्क ड्राइव पर परीक्षण किया गया: एक try, catch में गलत पर सेट

फ़ाइल मौजूद होने पर 1000 बार जांच कर रहा है, तो File.Copy कर रहा है यदि यह नहीं है: 203।48 मिलीसेकंड

1000 बार एक try, catch में गलत पर अधिलेखित सेट के साथ एक File.Copy कर: 14,758.74 मिलीसेकेंड

उस आधार पर, मैं यह स्पष्ट है कि एक फ़ाइल की जांच कर रही है पहले और अधिक कुशल हो जाएगा लगता होगा।

+0

बहुत ही रोचक, काउंटर-अंतर्ज्ञानी पर सीमा। मेरे 2 विकल्पों में स्टॉपवॉच को नियोजित करने के बाद, मैं बहुत समान परिणाम देख रहा हूं। – Milne

+0

मेरे परीक्षण में, यह ध्यान दिया जाना चाहिए कि यह एक ही फ़ाइल की कोशिश कर रहा था, इसलिए यह हर बार अस्तित्व में था। –

+0

जो मुझे लगता है कि यहां जोड़ा जाना आवश्यक है कि कोशिश करें/पकड़ें ब्लॉक बहुत सी CPU को संसाधित करने के लिए लेते हैं ... शायद यह धीमा हो रहा है, लेकिन इससे कोई फर्क नहीं पड़ता। दूसरा रास्ता बहुत बेहतर है। – Yuki

0

उन में से न तो सबसे तेज़ तरीका होने की संभावना है समस्या से संपर्क करने के लिए। मैं क्या करूँगा Directory.GetFiles अपने रिमोट ड्राइव पर कॉल करें, परिणामों की तुलना करें, और केवल अपनी आवश्यक फाइलों की प्रतिलिपि बनाएँ।

इस तरह केवल एक नेटवर्क एलएस समकक्ष ऑपरेशन है और आपको जितनी आवश्यकता हो उतनी प्रतिलिपि संचालन है।

+1

रिमोट ड्राइव लाखों छवि फ़ाइलों के साथ 4TB बड़ा है। थोड़ा अक्षम लगता है। – Milne

+1

@ कोल्टनमिलन आपको 'rsync' और इसके एल्गोरिदम को देखना चाहिए। –

+0

@ ta.speot.is धन्यवाद +1, rsync बहुत ही रोचक है, हालांकि मैं एक साधारण ऐप के लिए जो कुछ चाहता था उससे थोड़ा अधिक जटिल था। – Milne

2

आप और अधिक बेहतर प्रदर्शन पहले मामले का उपयोग कर देखने के लिए की संभावना है (हालांकि यकीन है कि आप एक try..catch में File.Copy करने के लिए कॉल लपेट, यदि फ़ाइल मौजूद है क्योंकि यह एक IOException फेंक होगा। आपका पहला उदाहरण अंतर्निहित मंच की सुविधा देता है फ़ाइल अस्तित्व के लिए चेक को संभाल लें, जिससे यह आपके कोड को अनुकूलित करने के तरीकों से अनुकूलित हो सकता है। आपके द्वारा किए जाने वाले प्रत्येक कॉल के लिए नेटवर्क में राउंड-ट्रिप समय के कारण, कॉल की संख्या में भारी कमी के कारण प्रदर्शन लाभ होगा।

इसके अतिरिक्त, रिमोट सिस्टम आपके कॉल के बीच File.Exists और File.Copy पर बदल सकता है, और बाद में संभावित रूप से उन फ़ाइलों को ओवरराइट कर देगा जो आपके द्वारा चेक किए जाने के दौरान बनाए जाते हैं और जब आप प्रारंभ करते हैं प्रति।

रिमोट मशीन पर फ़ाइलों की सूची बनाने के लिए पहले एक बेहतर तरीका होगा और फिर केवल उन फ़ाइलों की प्रतिलिपि बनाना होगा जो पहले से मौजूद नहीं हैं। जब आप यह प्रतिलिपि करते हैं, तो try..catch के साथ अपनी पहली विधि का उपयोग करें। इससे यह सुनिश्चित होता है कि जब आप शुरू करते थे वहां फ़ाइलों की प्रतिलिपि बनाने का प्रयास करने में समय बर्बाद नहीं करते हैं और यह भी सुनिश्चित करते हैं कि आप गलती से ऐसी फाइल को ओवरराइट न करें जो चीजों को कॉपी करने के बाद बनाई गई हो।

+0

मुझे लगता है कि आप कहते हैं कि लाखों फाइलें हैं, लेकिन शायद वे सभी एक निर्देशिका में नहीं हैं। यदि आप फ़ाइलों को स्थानांतरित करने वाली निर्देशिकाओं की संख्या फ़ाइलों की संख्या (शायद 1: 5 की तरह कुछ की तुलना में बड़ी है, लेकिन आपको सही संख्या खोजने के लिए प्रोफ़ाइल करना होगा) तो आप केवल पहली तकनीक का उपयोग करना चाहते हैं। यदि निर्देशिकाओं की संख्या छोटी है और आप जिन फ़ाइलों की प्रतिलिपि बना रहे हैं, उनकी संख्या बड़ी है, तो आप जिन निर्देशिकाओं की देखभाल करते हैं उनमें से प्रत्येक फाइल के नामों के नामों का एक ही हस्तांतरण आपके द्वारा किए जाने वाले राउंड ट्रिप की संख्या की तुलना में छोटा है प्रत्येक फ़ाइल की प्रतिलिपि बनाने का प्रयास करें। – seawolf

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