2015-07-22 10 views
7

मेरे सॉफ़्टवेयर में मेरे पास 4x 500GB फ़ाइलें हैं जो मैं पर अनुक्रमिक रूप से को बूस्ट मेमोरी मैप किए गए फ़ाइल एपीआई का उपयोग करके गोलाकार फैशन में लिखता हूं।सर्कुलर फ़ाइल के साथ डिस्क IO समस्या

मैं 32 एमबी ब्लॉक में क्षेत्रों को आवंटित करता हूं, और अंत में एक ब्लॉक आवंटित करते समय मैं दो मेमोरी मैप किए गए क्षेत्र बना देता हूं जहां पहला फ़ाइल का अंत होता है और दूसरा फ़ाइल की शुरुआत में होता है और अंत पते पर मैप किया जाता है पहले क्षेत्र का।

अब यह छोटी फ़ाइलों के साथ ठीक काम करता है। हालांकि, अंत क्षेत्र में जाने पर बड़ी फ़ाइलों के साथ डिस्क प्रदर्शन मंजिल पर जाता है और मुझे यकीन नहीं है कि इससे कैसे बचें।

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

क्या किसी के पास इस मुद्दे से बचने के तरीके पर कोई विचार है?

मैं विंडोज 10 में अपग्रेड करने की सोच रहा था और उम्मीद करता हूं कि यह बेहतर काम करेगा। लेकिन यह एक जोखिम भरा बदलाव है कि मैं अभी से बचना चाहता हूं।

मुझे यह भी ध्यान रखना चाहिए कि फ़ाइलें 2x 3TB सीगेट कॉन्स्टॉलेशन एंटरप्राइज़ ड्राइव के साथ सॉफ़्टवेयर RAID 1 पर रहती हैं। इन ड्राइवों में 60 एमबी/एस की न्यूनतम अनुक्रमिक लेखन गति और 120 एमबी/एस का अवतार है, और मैं कुल मिलाकर 30 एमबी/एस की गति से सभी फाइलों के साथ लिख रहा हूं।

कोड here पाया जा सकता है।

संपादित करें:

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

+0

आप डिस्क प्रदर्शन को मापते हैं और फ़ाइलों का सीमा आकार क्या है जिसके बाद आप समस्या का अनुभव करते हैं? –

+0

मैं वर्तमान में छोटी और छोटी फाइलों के साथ परीक्षण कर रहा हूं। हालांकि यह अंत तक पहुंचने से लगभग एक दिन लगते हैं। मैं अपडेट करूंगा क्योंकि मुझे और परिणाम मिलेंगे। – ronag

+0

मैं इसे लिखने वाले बफर द्वारा मापता हूं, मेरे पास 4x गर्म स्रोत हैं जो 4 x 7.5 एमबी/एस में डेटा भेजते हैं और प्रत्येक इनपुट पैकेट buffered है। यदि बफर बढ़ने लगते हैं तो इसका मतलब है कि फ़ाइल पर्याप्त तेज़ी से लिखी नहीं जाती है और जब यह 4 जीबी तक पहुंच जाती है तो यह पैकेट छोड़ना शुरू कर देती है, जो वर्तमान में इस क्षेत्र में पहुंचने के बाद हो रहा है। – ronag

उत्तर

1

"इन ड्राइवों में 60 एमबी/एस की न्यूनतम क्रमिक लेखन गति है" - जो अप्रासंगिक है क्योंकि आप अनुक्रमिक लेखन नहीं कर रहे हैं।

एसएसडी कैशिंग का उपयोग करें, या डिज़ाइन पर पुनर्विचार करें (बफर रैपरराउंड में पहुंच को रोकने के लिए एक तरीका खोजें)।


spee से संबंधित नहीं: तुम सिर्फ ताकि आप (? मालिकाना) चाल का उपयोग करने के लिए "लगातार" पता क्षेत्रों मैप करने के लिए नहीं है, एक परिपत्र बफर सीधे फाइल करने के लिए मैप किया गया इस्तेमाल कर सकते हैं। किसी न किसी विचार: boost::circular_buffer equivalent for files?

+0

ठीक है, जिस तरह से मैं 32 एमबी ब्लॉक में लिख रहा हूं वह अनुक्रमिक के समान ही है, ड्राइव पर खोज समय ~ 50ms है जिसका अर्थ है कि 0.01% सैद्धांतिक ओवरहेड भी नहीं है। – ronag

+0

मैं कई कारणों से boost :: circular_buffer का उपयोग नहीं कर सकता, दूसरी बात यह है कि मैं पूरी फाइल को एक ही बार में मैप नहीं कर सकता। मैंने कोशिश की है और मशीन मेमोरी और दुर्घटनाओं से बाहर हो जाती है। – ronag

+0

क्यों नहीं? क्या बफर आकार में तय नहीं है? क्या आप 16 बिट एड्रेस स्पेस में हैं? – sehe

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