2011-11-21 15 views
15

मैंने कुछ ऐसे अनुप्रयोगों के लिए मेमोरी मैप किए गए आईओ की जांच करने में कुछ समय बिताया है जिस पर मैं काम कर रहा हूं। मेरे पास कुछ बहुत बड़ी (टीबी स्केल) फ़ाइलें हैं, और मैं ओएस-स्तरीय कैशिंग का अधिकतम उपयोग करने, पढ़ने और लिखने दोनों के लिए, उनमें से सेगमेंट को मेमोरी में मैप करना चाहता हूं। जो सॉफ्टवेयर मैं लिख रहा हूं उसे यूनिक्स/लिनक्स और विंडोज के तहत काम करने की ज़रूरत है ... प्रदर्शन महत्वपूर्ण है।प्लेटफ़ॉर्म स्वतंत्र मेमोरी मैप किया गया [फ़ाइल] IO

मैंने boost::iostreams::mapped_file_source और boost::iostreams::mapped_file_sink की खोज की है, जो मुझे लगता है कि अधिकांश सुविधाएं प्रदान करते हैं। सुविधाओं मैं चाहते हैं, लेकिन नहीं मिला है कर रहे हैं:

  • डिस्क पर लिखी डेटा की एक तुल्यकालन जबरदस्ती (msync (2) यूनिक्स पर, विंडोज पर FlushViewOfFile)
  • फ़ाइलों का ताला लगा दो प्रक्रियाओं को रोकने के लिए (यूनिक्स) निर्माण समय में एक ही समय में एक ही फाइल लिखने के लिए प्रयास कर रहा है (या फाइल अभी भी लिखा जा रहा है पढ़ा ..)
  • फ़ाइल का नियंत्रण विशेषताओं

मैं "boost/iostreams/device/mapped_file.hpp" का उपयोग कर इन बातों को कर सकते हैं ? क्या अन्य प्लेटफार्म स्वतंत्र पुस्तकालय हैं जो मेरी आवश्यकताओं के अनुरूप बेहतर होंगे? क्या मुझे यह लचीलापन प्राप्त करने के लिए अपनी खुद की क्रॉस-प्लेटफार्म लाइब्रेरी विकसित करनी चाहिए?

+0

Btw, "स्मृति मैप की आई/ओ" आम तौर पर पढ़ने आई/ओ पतों का उपयोग करके (मैप की स्मृति उर्फ) बंदरगाहों (एक सूचक का उपयोग कर की तरह) के बजाय विशेष प्रोसेसर का उपयोग करने के लिए संदर्भित करता है मैं/हे निर्देश –

+0

उचित बिंदु। मैं स्मृति मैप किए गए फ़ाइल I/O [http://en.wikipedia.org/wiki/Memory-mapped_file] के बारे में बात कर रहा हूं - और इसे प्रतिबिंबित करने के लिए शीर्षक संपादित किया है। – aSteve

उत्तर

3

बढ़ावा देखें :: इंटरप्रोसेस और बूस्ट :: इंटरप्रोसेस :: file_mapping। उनके पास आपकी हर चीज है।

boost::interprocess

boost::interprocess::file_mapping

+0

आप सही हो सकते हैं ... लेकिन, boost :: interprocess के साथ, मैं नहीं देख सकता कि मैं ओएस-पेज-आकार वाले हिस्सों में डेटा को कैसे एक्सेस कर सकता हूं ( – aSteve

+0

@aSteve, यह लाइब्रेरी मेमोरी मैप का समर्थन करता है फाइलें, देखें: http://www.boost.org/doc/libs/1_48_0/doc/html/interprocess/managed_memory_segments.html#interprocess.managed_memory_segments.managed_mapped_files – Nim

+0

हां, boost :: interprocess समर्थन (प्रबंधित) मेमोरी मैप की गई फ़ाइलों का समर्थन करता है। .. इस संदर्भ में "प्रबंधित" का तात्पर्य है कि फ़ाइल में स्थान malloc() द्वारा "जैसा है" तक पहुंचा जा सकता है। अंतर-प्रक्रिया-संचार के लिए स्पष्ट रूप से मूल्यवान, लेकिन मुझे एक और अधिक बुनियादी "अप्रबंधित" की आवश्यकता है? "कच्चे" आईओ के लिए दृष्टिकोण। मुझे एक ऐसा फ़ंक्शन चाहिए जो एक मैप किए गए ब्लॉक में एक पॉइंटर लौटाता है जिसमें मनमानी फ़ाइल ऑफसेट होता है। बूस्ट :: iostreams :: mapped_file_ * इंटरफेस यहां आदर्श हैं ... हालांकि वे सिंक्रनाइज़ेशन/लॉकिंग के लिए समान लचीलापन प्रदान नहीं करते हैं। मैंने इंटरप्रोसेस दस्तावेज़ पढ़े हैं - मैं नहीं देख सकता कि "कच्चे" मैप किए गए आईओ के लिए इंटरप्रोसेस का उपयोग कैसे करें। – aSteve