2010-01-10 17 views
6

मैं एक फ़ाइल पढ़ रहा हूं और मैं या तो डेटा की एक पंक्ति (1700 अनुक्रमिक 17 बाइट्स के अनुक्रमिक पढ़ता है) या डेटा के कॉलम (1600 * 1700 से 17 बाइट्स को अलग करता है = 27,200 बाइट्स)। फ़ाइल या तो स्थानीय ड्राइव या रिमोट ड्राइव पर है। मैं 10 बार पढ़ता हूं इसलिए मैं प्रत्येक मामले में 272,000 बाइट डेटा में पढ़ने की उम्मीद करता हूं।अतिरिक्त पढ़ने के कारण नेटवर्क धीमी गति से

स्थानीय ड्राइव पर, मुझे लगता है कि मैं क्या उम्मीद करता हूं। अनुक्रमिक रूप से पढ़ने पर रिमोट ड्राइव पर मैं यह भी देखता हूं कि मैं क्या उम्मीद करता हूं लेकिन कॉलम पढ़ने पर, मुझे अतिरिक्त पढ़ने के टन मिलते हैं। वे 32,768 बाइट लंबा हैं और ऐसा प्रतीत नहीं होता है लेकिन वे 272,000 बाइट से कहीं भी 7 9 एमबी से 106 एमबी तक पहुंचने वाले डेटा की मात्रा बनाते हैं। यहाँ प्रक्रिया मॉनिटर का उपयोग कर उत्पादन है:

 
1:39:39.4624488 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Offset: 9,390,069, Length: 17 
1:39:39.4624639 PM DiskSpeedTest.exe 89628 FASTIO_CHECK_IF_POSSIBLE \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Operation: Read, Offset: 9,390,069, Length: 17 
1:39:39.4624838 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Offset: 9,388,032, Length: 32,768, I/O Flags: Non-cached, Paging I/O, Synchronous Paging I/O, Priority: Normal 
1:39:39.4633839 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Offset: 9,417,269, Length: 17 
1:39:39.4634002 PM DiskSpeedTest.exe 89628 FASTIO_CHECK_IF_POSSIBLE \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Operation: Read, Offset: 9,417,269, Length: 17 
1:39:39.4634178 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Offset: 9,444,469, Length: 17 
1:39:39.4634324 PM DiskSpeedTest.exe 89628 FASTIO_CHECK_IF_POSSIBLE \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Operation: Read, Offset: 9,444,469, Length: 17 
1:39:39.4634529 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Offset: 9,441,280, Length: 32,768, I/O Flags: Non-cached, Paging I/O, Synchronous Paging I/O, Priority: Normal 
1:39:39.4642199 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Offset: 9,471,669, Length: 17 
1:39:39.4642396 PM DiskSpeedTest.exe 89628 FASTIO_CHECK_IF_POSSIBLE \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Operation: Read, Offset: 9,471,669, Length: 17 
1:39:39.4642582 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Offset: 9,498,869, Length: 17 
1:39:39.4642764 PM DiskSpeedTest.exe 89628 FASTIO_CHECK_IF_POSSIBLE \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Operation: Read, Offset: 9,498,869, Length: 17 
1:39:39.4642922 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Offset: 9,498,624, Length: 32,768, I/O Flags: Non-cached, Paging I/O, Synchronous Paging I/O, Priority: Normal 

सूचना अतिरिक्त मैं के साथ 32,768 के पढ़ता/ओ झंडे करने के लिए सेट गैर-कैश, पेजिंग आई/ओ, तुल्यकालिक पेजिंग आई/ओ, प्राथमिकता: सामान्य। ये अतिरिक्त पढ़े हैं जो इसे 272 केबी से 106 एमबी तक लेते हैं और धीमेपन का कारण बन रहे हैं। वे स्थानीय फ़ाइल से पढ़ने पर नहीं होते हैं या यदि मैं एक पंक्ति पढ़ रहा हूं तो यह सभी अनुक्रमिक है।

मैंने FILE_FLAG_RANDOM_ACCESS को सेट करने का प्रयास किया है लेकिन यह मदद नहीं करता है। इन अतिरिक्त पढ़ने और उन्हें रोकने के तरीके के बारे में कोई भी विचार ???

Vista 64 बिट सिस्टम पर परीक्षण चल रहे हैं। मैं किसी प्रोग्राम के लिए समस्या के साथ-साथ एक कंसोल प्रोग्राम का प्रदर्शन करने के लिए स्रोत कोड प्रदान कर सकता हूं जो परीक्षण करता है।

+1

शायद आप उस कोड का हिस्सा पेस्ट कर सकते हैं जिसमें आप पढ़ते हैं। इससे कुछ कोडिंग गलती खत्म हो जाएगी, जो प्लेटफ़ॉर्म त्रुटियों से अधिक आम हैं :-) – Ariel

उत्तर

2

आप एसएमबी पर ओप लॉक मुद्दों में भाग ले रहे हैं। आम तौर पर जब नेटवर्क विंडो पर फ़ाइल को पढ़ने/सहेजने पर पूरी फ़ाइल को उस पर क्लाइंट काम पर खींच लेती है और वापस परिवर्तन भेजती है। जब आप फ्लैट फ़ाइल डेटाबेस या फ़ाइलों के साथ काम कर रहे हैं तो यह एक smb फ़ाइल शेयर में अनावश्यक पढ़ सकता है।

मुझे यकीन नहीं है कि पूरी फ़ाइल को खींचने का कोई तरीका है या नहीं, उस फ़ाइल से पंक्तियों को स्थानीय प्रतिलिपि पर पढ़ें और फिर परिवर्तनों को वापस दबाएं या नहीं।

आप ओप्लॉक्स और फ्लैट फ़ाइल डेटाबेस के बारे में कुछ दुःस्वप्न पढ़ेंगे।

http://msdn.microsoft.com/en-us/library/aa365433%28VS.85%29.aspx

सुनिश्चित नहीं हैं कि यह आपकी समस्या का हल है, लेकिन यह आप सही दिशा में इशारा मिल सकता है। सौभाग्य!

0

मैं इसे हर समय देखता हूं, और यह आपके नियंत्रण से बाहर है: नेटवर्क जो चाहता है वह करता है।

यदि आपको पता है कि फ़ाइल 1 एमबी से कम होने जा रही है, तो बस पूरी चीज़ को स्मृति में खींचें।

0

मेरा अनुमान है कि ओएस फ़ाइल के बाद अपने आप को बाद में पढ़ने की संभावना है जिस पर आपको बाद में डेटा की आवश्यकता है। यदि यह आपको चोट नहीं पहुंचा रहा है तो इससे कोई फर्क नहीं पड़ता।

CreateFile API के caching behavoir अनुभाग देखें।

आप यह देखने के लिए 'FILE_FLAG_NO_BUFFERING' को आजमा सकते हैं कि यह अतिरिक्त पढ़ने को रोकता है या नहीं। चेतावनी दी जानी चाहिए, इस ध्वज का उपयोग करके आपका आवेदन धीमा हो सकता है। आम तौर पर आप इस ध्वज का उपयोग करते हैं यदि आप समझते हैं कि जितनी जल्दी हो सके डिस्क से डेटा को स्ट्रीम करना है और ओएस कैशिंग केवल रास्ते में हो रही है।

यदि आप 'FILE_FLAG_SEQUENTIAL_SCAN' ध्वज का उपयोग करते हैं तो आप स्थानीय फाइलों के साथ नेटवर्क फ़ाइल के समान व्यवहार प्राप्त कर सकते हैं। यह झंडा संकेत विंडोज कैश मैनेजर के लिए है कि आप क्या करेंगे और समय से पहले आपके लिए डेटा प्राप्त करने का प्रयास करेंगे।

0

मुझे लगता है कि एसएमबी हमेशा बाइट्स के एक छोटे से सेट के बजाय एक ब्लॉक स्थानांतरित करता है।

ब्लॉक आकार बातचीत पर कुछ जानकारी यहां मिल सकती है। http://support.microsoft.com/kb/q223140

तो आप ब्लॉक के भीतर 17 बाइट्स के स्थानीय पढ़ने के बाद प्रासंगिक ब्लॉक की प्रतिलिपि बनाने के लिए पढ़ रहे हैं। (यदि आप पैटर्न को देखते हैं, तो 17 बाइट के कुछ जोड़े पढ़ते हैं जहां दो पढ़ एक ही ब्लॉक के भीतर गिरते हैं)।

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

अगर यह किसी भी सांत्वना है, iTunes performs abysmally when using a network drive too

2

मुझे इसका जवाब मिला। विंडोज़ पृष्ठ कैश के माध्यम से फ़ाइल पढ़ता है, इसलिए जब मैं 17 बाइट्स पढ़ता हूं, तो इसे पहले 32K के पूर्ण पृष्ठ को स्थानांतरित करना होता है और फिर पेज कैश से बाहर 17 बाइट्स कॉपी कर सकता है। प्रदर्शन पर गंदा परिणाम!

वही बात वास्तव में होती है जब पहली बार स्थानीय फाइल पर पढ़ा जाता है क्योंकि उस स्थिति में यह पृष्ठ कैश में एक समय में एक पूर्ण पृष्ठ लोड करता है। लेकिन दूसरी बार जब मैं स्थानीय रूप से परीक्षण चलाता हूं, तो फाइलें पहले ही पेज कैश में हैं, इसलिए मुझे यह नहीं दिखाई देता है। और यदि सुपरफ़ेच चालू है और मैं थोड़ी देर के लिए इन परीक्षणों को कर रहा हूं, तो विंडोज में से पहले फ़ाइल लोड करना शुरू कर देगा, फिर भी मैं अपना टेस्ट एप्लिकेशन चलाता हूं, इसलिए मुझे पृष्ठ को पढ़ने के बारे में नहीं दिखाई देता है।

तो ऑपरेटिंग सिस्टम उन दृश्यों के पीछे बहुत सी चीजें कर रहा है जो अच्छे प्रदर्शन परीक्षण को प्राप्त करना मुश्किल बनाता है!

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