2010-08-03 8 views
18

के अलावा किसी फ़ाइल की प्रतिलिपि बनाने का कोई तेज़ तरीका है, उसी ड्राइव पर फ़ोल्डर ए से फ़ोल्डर बी तक 1.6 जीबी फ़ाइल के लिए File.Copy(src, dest); करने में लगभग 2 मिनट लगते हैं। क्या सी #/.NET कोड (डब्ल्यू/ओ हार्डवेयर) में ऐसा करने का कोई तेज़ तरीका है - स्ट्रीम, थ्रेडिंग इत्यादि के साथ कुछ?क्या फ़ाइल.कॉपी

क्या एक फाइलस्ट्रीम तेज होगा? एक वर्ग के बारे में जो थ्रेडपूल का उपयोग करके फ़ाइल को जोड़ता है, और बाइट्स की एक श्रृंखला पढ़ता है/बाइट्स की एक श्रृंखला लिखता है [जो फ़ाइल को दूषित करने के लिए एक शानदार तरीका लगता है, लेकिन अखंडता प्राथमिकता 1 नहीं है, इसकी गति :-) ]

मैंने खोज की है लेकिन हर कोई फ़ाइल का उपयोग करता है। कॉपी, लेकिन यह धीमा है (विंडोज कॉपी के रूप में धीमा) - मैं किसी तृतीय पक्ष टूल का उपयोग नहीं करना चाहूंगा। ,

> C# : 2.15m 
> Windows Explorer: 2.53m 
> TeraCopy: 2.26m 
> FastCopy: 2.24m 

ठीक है उन का औसत नहीं हैं और मैं जानता हूँ कि वे बाद में रन पर थोड़ा बदल सकते हैं, लेकिन:

कॉपी समय की तुलना:


यहाँ कुछ प्रश्नों के कुछ जवाब हैं मैंने वास्तव में सोचा था कि फ़ाइल की प्रतिलिपि बनाने का एक तेज़ तरीका होगा क्योंकि मुझे लगता है कि विंडोज अतिरिक्त सुरक्षा और अखंडता जांच कर रहा था :-(

मुझे अभी भी उम्मीद है मुझे अच्छा जवाब (जैसे 'अगर आप मीटर बफ़र और सुरक्षा n बंद करूं ओह हां, 1.5GB पर फ़ाइलें एक्स तेजी से हो जाएगा') - ठीक है, मैं सिर्फ इस बिंदु पर बधाई देने के लिए कर रहा हूँ।

+11

मुझे लगता है कि आपको विंडोज़ बॉक्स पर, विंडोज़ से तेज, फ़ाइल कॉपी करने के लिए कड़ी मेहनत की जाएगी। –

+0

मुझे लगता है कि आपका ड्राइव पारंपरिक प्लेटर-आधारित ड्राइव है। यदि ऐसा है, तो फ़ाइल को तोड़ने की संभावना समय की वजह से धीमी चीजें घट जाएगी। – Greg

+0

* एक ही * ड्राइव पर 1.6 जीबी को नए स्थान पर कॉपी करना एक ऐसी गतिविधि नहीं है जो हार्ड ड्राइव के लिए बहुत अच्छी है। सिमुलेटिक पठन और लिखने का समर्थन करने के लिए इसे पूरे स्थान पर कूदना होगा। –

उत्तर

2

मुझे लगता है कि विंडोज कॉपी, file.copy, Copyfile सभी कॉपी करने के लिए समान अंतर्निहित ऑपरेटिंग सिस्टम कॉल का उपयोग करते हैं। मुझे संदेह होगा कि जो भी आप लिखते हैं वह ओएस आंतरिक कॉल से बेहतर प्रदर्शन करेगा।

5

आप पहले से ही अपने निपटान में हार्डवेयर का उपयोग करने की कोशिश कर सकते हैं, और स्मृति में एक बड़ा बफर आवंटित कर सकते हैं। बड़े हिस्से में पढ़ने और लिखकर आप कुछ ओवरहेड को हटाने में सक्षम हो सकते हैं।

हालांकि, छुटकारा पाने के लिए बहुत अधिक ओवरहेड नहीं है, बोतल गर्दन अभी भी डिस्क I/O है। मैं सबसे अच्छा कुछ निष्पादन समय में 5% की कमी की उम्मीद करता हूं।

7

यदि आप वास्तविक प्रतिलिपि के बजाय प्रतीकात्मक या हार्डलिंक बनाने में रुचि रखते हैं तो निम्न Windows API उपयोगी हो सकते हैं।

+7

+1 पर्वत को स्थानांतरित करने का सबसे तेज़ तरीका पर्वत को बिल्कुल हिलाना नहीं है। ;> – dthorpe

+0

सिंबलिकलिंक का क्या फायदा होगा, मैं इसके चारों ओर अपने सिर को लपेटने की कोशिश कर रहा हूं और पी/Invoke के साथ नमूना किया - अगर मैं नया FileInfo ("symbolicFileName.txt") आज़माता हूं। नाम यह नाम देता है, लेकिन अगर मैं कोशिश करता हूं File.Open ("symbolicFileName.txt", .....) यह कहता है कि यह फ़ाइल नहीं ढूंढ सकता है। सिंबलिकिंक पर मिली जानकारी मुझे बेकार है, जहां तक ​​वास्तव में यह समझाती है कि यह क्या है और यह मुझे कैसे लाभ पहुंचा सकता है। जो मैं वास्तव में चाहता हूं वह संशोधित करने के लिए एक फ़ाइल है, यदि यह सब अच्छा है, तो मूल को प्रतिस्थापित करें, मैं इसे फाइल के साथ कर रहा था। दोनों तरीकों से कॉपी करें। – schmoopy

+2

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

4

File.Copy Kernel32.dll में CreateFile के लिए एक कॉल करता है। यदि आप बहुत सारी प्रतिलिपि बना रहे थे और बहुत सी छोटी फाइलें (लाखों लोगों को सोचें) तो पैरामीटर के साथ खेलने के लिए P/Invoke करना और अनुमति मांग छोड़ना उचित हो सकता है। चालक कोड के अंदर 2 मिनट की एक बड़ी फ़ाइल 99.9 99% खर्च की जाती है।

1

मैंने यह कोशिश नहीं की है, लेकिन यह तेज़ हो सकता है।

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

0

मुझे लगता है कि आपको सबसे पहले यह जांचना चाहिए कि आपकी डिस्क कितनी खंडित है। यदि आपकी फ़ाइल कई टुकड़ों में है और आपके पास दूसरे के लिए बड़ी निरंतर खाली स्थान नहीं है तो डिस्क को अक्सर सिर को स्थानांतरित करना चाहिए जो बहुत धीमी है।

हो सकता है कि आपके डिस्क सरल पुराने और धीमी है और आप तक पहुँचने यह अधिकतम प्रदर्शन है। उस मामले में समाधान सरल है, आपको नया, या बेहतर दो खरीदने और RAID 0 बनाने की आवश्यकता है।

आप यह भी जांच सकते हैं कि किसी और चीज की प्रतिलिपि बनाने के दौरान एक ही डिस्क का उपयोग नहीं होता है, उदाहरण के लिए एंटी-वायरस या इंडेक्सिंग सेवा ।

मैं किसी भी सॉफ्टवेयर समाधान प्रस्तावित नहीं किया क्योंकि मैं नहीं मानता कि कुछ भी ओएस द्वारा प्रदान कार्यों की तुलना में तेजी है।

1

एक एकल फाइल के लिए, एक ही ड्राइव से/जा रहा है, अपने प्रश्न का उत्तर है: कोई। फ़ाइलों की

नेटवर्क स्थानान्तरण के लिए, आगे बढ़ टन, और अन्य अधिक जटिल स्थितियों सुधार की संभावना हो सकती है।

अपने वर्तमान आवश्यकता ही डिस्क पर एक दूसरे भौतिक (गैर symbollic) स्थान पर GB का कॉपी करने के लिए है, तो प्रदर्शन में सुधार के लिए अपने सबसे अच्छा मौका शायद एक तेजी से डिस्क है।

0

सभी इच्छा, आवंटन की नकल के समय ओएस द्वारा निर्णय लिया की निर्भर करता है कि फ़ाइल कैश में है (उसी तरह यह से बचने के लिए 5x करते हैं)।

सबसे स्पष्ट परिणाम यह है कि यदि आप परीक्षण को कई बार दोहराते हैं।

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