2010-03-28 3 views
12

मैं एक मैप किए गए बाइनरी फ़ाइल को स्मृति में बनाना चाहता हूं; हालांकि मुझे यकीन नहीं है कि सिस्टम में मैप किए जाने के लिए फ़ाइल कैसे बनाएं। मैंने कई बार प्रलेखन पढ़ा और महसूस किया कि 2 मैप किए गए फ़ाइल कार्यान्वयन हैं, एक iostream में और दूसरा इंटरप्रोसेस में।क्या बूस्ट iostream मैप की गई फ़ाइल के बीच कोई अंतर है और इंटरप्रोसेस मैप की गई फ़ाइल को बढ़ावा देता है?

क्या आपके पास लोगों को साझा स्मृति में मैप किए गए फ़ाइल को बनाने का कोई विचार है? मैं एक बहु थ्रेडेड प्रोग्राम को बाइनरी फ़ाइल प्रारूप में लिखे गए बड़े डबल की एक सरणी पढ़ने की अनुमति देने की कोशिश कर रहा हूं। Iostream और interprocess में मैप की गई फ़ाइल के बीच क्या अंतर है?

उत्तर

2

जहां तक ​​मैं कह सकता हूं, iostreams मैप की गई फ़ाइल को साझा मेमोरी में रखेगा (यह वही है जो आप चाहते हैं); हालांकि, इंटरप्रोसेस हालांकि फ़ाइल को किसी अन्य प्रक्रिया के पता स्थान में रखता है।

आपको शायद iostreams का उपयोग करना चाहिए जब तक कि आपके पास एकाधिक प्रक्रियाएं (धागे नहीं) हों जो किसी अन्य तरीके से एक दूसरे के साथ संवाद कर रही हों।

+0

स्पष्टीकरण जो के लिए धन्यवाद, मैं iostream कोशिश करूँगा। – Yijinsei

+2

@ जो डी: यह इंप्रेशन नहीं है कि मैं इंटरप्रोसेस लाइब्रेरी से मिलता हूं। विशेष रूप से, प्रलेखन से: "सिस्टम फ़ाइल को जोड़ने और प्रक्रिया के पता स्थान को जोड़ने के लिए एक फ़ाइल मैपिंग बनाता है।" कई प्रक्रियाओं के लिए, यह अनिवार्य रूप से एक फाइल सिस्टम बैकअप के साथ स्मृति साझा किया। – rcollyer

+0

हां, लेकिन इंटरप्रोसेस लाइब्रेरी, फाइल सिस्टम बैकअप नहीं बनाता है, यह बस इंटरप्रोसेस साझा मेमोरी में फ़ाइल को मैप करता है। हालांकि iostreams, इसे एक प्रक्रिया के लिए स्मृति में मैप करेगा। जो शायद (मैंने कार्यान्वयन की जांच नहीं की है) अधिक कुशल है। –

0

मुख्य अंतर जो मैं दोनों के बीच देखता हूं वह यह है कि उनका उपयोग कैसे किया जाता है। मेमोरी मैप किए गए फ़ाइल का उपयोग करने के लिए boost-interprocess में, आप प्लेसमेंट new का उपयोग करके उस मेमोरी स्पेस में ऑब्जेक्ट्स बनाते हैं, और वे ऑब्जेक्ट्स स्वचालित रूप से आपकी फ़ाइल में बाइनरी रूप में लगातार होती हैं। अन्य प्रक्रियाएं तब एक ही फाइल को मैप कर सकती हैं और उन ऑब्जेक्ट्स का उपयोग कर सकती हैं, या प्रोग्राम स्वयं इसे लगातार कैश के रूप में उपयोग कर सकता है और बाद में उन्हें पुनः लोड कर सकता है। मेमोरी मैप की गई फाइलें boost-iostreamsboost::iostream होने के अतिरिक्त लाभों के साथ फ़ाइल स्ट्रीम की तरह कार्य करती हैं, और इंटरप्रोसेस संचार के लिए स्ट्रीम सेमेन्टिक्स प्रदान करती हैं।

एक ही प्रक्रिया के लिए, boost::iostream स्मृति मैप की गई फ़ाइलों का उपयोग करने के लिए बहुत अधिक लाभ नहीं है। हालांकि, यह फ़ाइल के साथ काम करने में विलंबता को कम कर सकता है क्योंकि यह पहले से ही स्मृति में लोड हो चुका है। लेकिन, यदि आप लगातार फ़ाइल के कुछ हिस्सों को फिर से लिख रहे हैं, तो आपको केवल यह लाभ प्राप्त होता है। फ़ाइल के एक ही पढ़ने/लिखने के लिए, कोई गति नहीं हो सकती है।

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