2012-07-09 9 views
8

मैं विंडोज 7 64 बिट के तहत बड़ी संख्या में छवि फ़ाइलों (~ 10000 x 16 एमबी) को पढ़ने/लिखने के लिए मेमोरी मैप की गई फ़ाइलों का उपयोग कर रहा हूं। मेरे लक्ष्य हैं:असीमित रूप से स्मृति मैप किए गए फ़ाइल को कैसे फ़्लश करें?

  1. जितना संभव हो उतना डेटा कैश किया गया।

  2. नई छवियों को आवंटित करने और जितनी जल्दी हो सके उन्हें लिखने में सक्षम होने के नाते।

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

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

क्या असीमित रूप से फ़ाइल मैपिंग को फ़्लश करने का कोई तरीका है? मुझे मिला एकमात्र समाधान Unmap() और MapViewOfFile() फिर से है, लेकिन इस दृष्टिकोण का उपयोग करके मैं एक ही डेटा पॉइंटर फिर से प्राप्त नहीं कर सकता। क्या कोई बेहतर दृष्टिकोण सुझा सकता है?

संपादित करें: पढ़ना WINAPI प्रलेखन थोड़ी देर, ऐसा लगता है कि मैं अपने समस्या के लिए एक उपयुक्त समाधान पाया:

एक स्मृति सीमा उस गंदे पृष्ठों की एक फ्लशिंग में परिणाम अवरोधित नहीं है पर VirtualUnlock() कॉलिंग।

उत्तर

2

मैंने सुना है कि FlushViewOfFile() फ़ंक्शन तब तक प्रतीक्षा नहीं करता जब तक कि यह भौतिक रूप से फ़ाइल पर लिख न जाए।

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366563(v=vs.85).aspx

FlushViewOfFile समारोह फ़ाइल मेटाडाटा फ्लश नहीं करता है, और जब तक परिवर्तन अंतर्निहित हार्डवेयर डिस्क कैश से प्लावित कर रहे हैं और शारीरिक रूप से डिस्क पर लिखी वापस जाने के लिए इंतजार नहीं करता है।

कॉल करने के बाद "फ्लशफाइलबफर (...)" तो आपका डेटा डिस्क पर शारीरिक रूप से लिखा जाएगा।

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