2010-07-02 21 views
11

हम एक साधारण फ़ाइल का उपयोग कर रहे हैं। हमारे डेटाबेस बैकअप को अतिरिक्त स्थानों पर ले जाने के लिए सी # में कॉपी करें।फ़ाइल की सीमा गति। कॉपी

हालांकि कुछ सर्वरों पर, यह SQL सर्वर को बहुत अधिक काम करना बंद कर देता है। इन सर्वरों में बहुत सीमित स्मृति है, इसलिए वे हर बार हार्डड्राइव पर डेटा पेजिंग कर रहे हैं।

वैसे तो हम चाहिए अधिक स्मृति खरीदने के लिए, यह एक लंबे समय के लिए होने जा रहा नहीं कर रहा है: -/

अगर मैं किसी भी तरह File.Copy आपरेशन की गति को सीमित कर सकते तो मैं सोच रहा हूँ? (इस प्रकार एसक्यूएल सर्वर को हार्डड्राइव तक पहुंचने के लिए कुछ कमरा दे रहा है)

मैं दो धाराओं के साथ "पुराने स्कूल" दृष्टिकोण का उपयोग कर सकता हूं, एक बफर के माध्यम से पढ़ना और लिखना, और पढ़ने के बीच 5 एमएस या तो सो सकता हूं। लेकिन अगर मैं ऐसा उपलब्ध हूं, तो मैं वास्तव में एक स्वच्छ समाधान पसंद करूंगा।

+0

क्या आप गति को सीमित करना चाहते हैं, या वास्तव में स्मृति पदचिह्न? – Frank

+0

क्या आपने 'न्यूनतम प्राथमिकता' वाले थ्रेड पर प्रतिलिपि कोड चलाने का प्रयास किया है? सुनिश्चित नहीं है कि यह मदद करेगा हालांकि यह कर्नेल 32 'CopyFile' फ़ंक्शन का उपयोग करता है। –

+0

बस उसी ड्राइव पर बैकअप न बनाएं क्योंकि एक SQL सर्वर इसके डीबेस के लिए उपयोग कर रहा है। –

उत्तर

7

CopyFileEx आपको क्या चाहिए कर सकते हैं - यह है कि आप के रूप में एक कृत्रिम कि इस स्थिति के लिए हालांकि slowing method (प्रयास नहीं किया है इस्तेमाल कर सकते हैं एक कॉलबैक फ़ंक्शन है इसलिए मैं वास्तविक प्रभावों के बारे में अनिश्चित हूं - आईएमएचओ के प्रयास के लायक)।

+0

मैं इसे जाने दूंगा - मैं देखूंगा कि क्या एमएसडीएन के पास कॉलबैक के बारे में कुछ और जानकारी है (कितनी बार इसे आगे कहा जाता है) – Steffen

+1

यह सी # स्ट्रीम का उपयोग करने से कहीं अधिक तेज़ होना चाहिए। डब्ल्यूएक्सपी पर बफर ** 65536 बी ** है (अधिसूचना तब होती है जब खंड की प्रतिलिपि बनाई जाती है)। Vista और W7 पर यह बड़ा है। आप फ़ाइल को केवल 1 मशीन पर कॉपी कर सकते हैं और वहां से फ़ाइल को अन्य बैकअप स्थानों पर दोहरा सकते हैं। –

+0

अच्छा लगता है, धाराओं के साथ मेरी प्राथमिक चिंता वास्तव में मूल एपीआई फ़ंक्शन की तुलना में इसका प्रदर्शन है (जो फ़ाइल.कॉपी भी है: कॉपीफाइल) मैं इसे ट्यूज़डे पर देखूंगा, क्योंकि मुझे यह नहीं मिल रहा है इसे जल्द से जल्द काम करने के लिए। – Steffen

2

क्या आपने अपनी कॉपी प्रक्रिया को सामान्य से नीचे प्राथमिकता देने का प्रयास किया है? आप कार्य प्रबंधक माध्यम से ऐसा कर या start आदेश का उपयोग कर सकते हैं:

> start myCopyApp.exe /BELOWNORMAL 
+3

यह सिस्टम काम करेगा यदि सिस्टम सीपीयू-बाध्य है, लेकिन शायद नहीं यदि यह I/O-bound है? – ChrisW

+0

ओपी राज्यों के रूप में 'इन सर्वरों में बहुत सीमित स्मृति है', मुझे लगता है कि यह इनमें से कोई नहीं है, लेकिन स्मृति प्रतिबंध है। – Frank

+0

@ फ्रैंक मुझे लगता है कि स्मृति प्रतिबंध डिस्क एक्सेस (स्वैप फ़ाइल में) का कारण बनता है, और इसलिए I/O-bound होने के बराबर है। – ChrisW

2

कोई फ़ाइल.कॉपी के माध्यम से उपलब्ध नहीं है। आपके पास कई अन्य विकल्प हैं। जैसा कि आप कहते हैं, आप बाइट्स को मैन्युअल रूप से स्ट्रीम कर सकते हैं, कभी-कभी सोते हैं। आप बीआईटीएस के कार्यान्वयन का उपयोग कर सकते हैं, हालांकि यह एक छोटा ओटीटी है।

इसके अलावा, यदि समस्या स्मृति है - फ़ाइल को संपीड़ित करें या इसे बाद में पुनर्निर्मित करने के लिए छोटी फ़ाइलों में खंडित करें।

+1

नोट: SQL सर्वर 2008+ के लिए आप "बैक अप डेटाबेस" पृष्ठ में बैकअप के संपीड़न को सक्षम कर सकते हैं। –

+0

संपीड़न के साथ अच्छी कॉल, हालांकि ये अभी भी SQL Server 2005 के साथ फंस गए हैं :-( – Steffen

1

मैं दो धाराओं के साथ "पुराने स्कूल" दृष्टिकोण का उपयोग कर सकता हूं, एक बफर के माध्यम से पढ़ना और लिखना, और पढ़ने के बीच 5 एमएस या तो सो सकता हूं।

आप करते हैं, FILE_FLAG_NO_BUFFERING ध्वज का उपयोग कर देखो: अन्यथा चाहे कितना छोटा आपके आवेदन बफर है, फाइल सिस्टम बफरिंग (और इसलिए अतिरिक्त अदला-बदली के कारण) हो जाएगा।

+1

चूंकि बफर मेमोरी का उपयोग बहुत कम किया जाएगा, विंडोज * * स्मृति के उस हिस्से को स्वैप नहीं करना चाहिए (+ इसमें बहुत छोटी स्मृति पदचिह्न है) लेकिन इसके बजाय स्मृति के अन्य (कम इस्तेमाल किए गए) हिस्सों को स्वैप करें। इसके अलावा, सीपीयू और डिस्क आईओ ऑपरेशंस में काफी वृद्धि होगी। –

+0

@ जारोस्लाव जांडेक - FILE_FLAG_NO_BUFFERING इनपुट और आउटपुट फाइलों पर बफरिंग को प्रभावित/अक्षम करेगा (उदाहरण के लिए रीड-बफर बफरिंग) जो अन्यथा होगा फाइल सिस्टम ड्राइवर के भीतर/अंदर निष्पादित किया गया। मैं सुझाव दे रहा हूं कि यह बफरिंग अक्षम होनी चाहिए, क्योंकि इस फ़ाइल सिस्टम बफरिंग को सक्षम करना (जो डिफ़ॉल्ट रूप से है) स्मृति लेता है और इसलिए स्वैपिंग का कारण बनता है, और उसे इसकी आवश्यकता भी नहीं होती है (क्योंकि फ़ाइल प्रतिलिपि केवल एक बार फ़ाइल के प्रत्येक भाग को छूना चाहती है) – ChrisW

+0

@ChrisW: आपको कुछ डेटा पढ़ने की जरूरत है फिर (एक बफर में) और उसके बाद एक फ़ाइल को लिखें (जिसे अनबफर किया जा सकता है - प्रत्यक्ष लिखना)। यदि ऑपरेशन अनुक्रमिक नहीं होगा, तो बफर बर्बाद हो जाएगा। इस मामले में यह कोई फर्क नहीं पड़ता कि क्या कोई फर्क नहीं पड़ता। प्रतिलिपि बनाने के लिए, यह दृष्टिकोण बेकार है क्योंकि सिस्टम पहले से ही प्रभावी ढंग से करता है (यदि आप मैन्युअल रूप से रीडफाइल और लिखेंफ़ाइल कर रहे थे, तो यह अलग होगा)। इसके अलावा फाइल सिस्टम के बहुत से क्षेत्रों में बहुत से WINAPI हैंडलिंग और सही बफर आकार और संरेखण की आवश्यकता होगी ... –

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