2012-05-14 8 views
5

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

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

तो, क्या इसके आसपास कोई रास्ता है?

  • शायद कुछ मिश्रित मोड सी ++ के माध्यम से जो स्मृति मैप किए गए डेटा पर एक प्रबंधित एपीआई का पर्दाफाश कर सकता है?
  • असुरक्षित सी # के साथ प्रत्यक्ष सूचक मैनिपुलेशन के बारे में क्या?

सामान्य समस्या जिसे मैं हल करने का प्रयास कर रहा हूं वह कई प्रक्रियाओं के बीच एक बड़ी डेटा संरचना साझा कर रहा है। डेटा संरचना का उपयोग "प्रश्न" के एक छोटे से सेट का उत्तर देने के लिए किया जाता है जिसे एक साधारण एपीआई (यानी मूल रूप से, अन्य डेटा के समूह की अत्यधिक विशिष्ट अनुक्रमणिका) के रूप में उजागर किया जा सकता है।

एक तरफ नोट पर, क्या यह "बड़ी मात्रा में डेटा साझा करने" परिदृश्य के लिए .NET API बेकार नहीं बनाता है?

+1

http://code.msdn.microsoft.com/windowsdesktop/Inter-process-communication-e96e94e7 –

+0

क्या आप पूरी फ़ाइल को .NET एप्लिकेशन में एक बार पढ़ते हैं? यदि आप स्मृति-मैप की गई फ़ाइल के भाग पढ़ रहे हैं, तो आवश्यकतानुसार, आप बहुत सारे छोटे बफर आवंटित करते हैं, लेकिन यह उतना महंगा नहीं है जितना आप सोच सकते हैं। प्रतियां बनाने से बचना संभव हो सकता है, लेकिन प्रतियां वास्तव में एक समस्या बनाने का उपर है? –

+0

मेरे पास .NET अनुप्रयोग हैं जो मेमोरी मैप की गई फ़ाइलों सहित कई तरीकों से "प्रभावी मात्रा में डेटा साझा करते हैं"। विशेष रूप से, एक सूट 8 गीगाबाइट के ऊपर साझा करता है, और उन कार्यक्रमों का कुल स्मृति उपयोग आश्चर्यजनक रूप से 8 गीगाबाइट के करीब है। –

उत्तर

4

आप मैप किए गए मेमोरी तक सीधे पहुंचने के लिए असुरक्षित कोड का उपयोग कर सकते हैं। मेरा सुझाव है कि आप "ब्लिटेबल structs" में देखें जो संरचना प्रकार हैं जिन्हें बिना संशोधन के स्मृति में कॉपी किया जा सकता है। यहां एक उदाहरण दिया गया है:

struct MyDataRecord { public int X, Y; } 

... 

for (var i = 0 .. 10) { 
((MyDataRecord*)pointerToUnmanagedMemory)[i] = new MyDataRecord() { X = i, Y = i * i }; 
} 

यह बहुत ही आकर्षक और सुविधाजनक है।

+0

हम्म, आपने नामित म्यूटेक्स को छोड़ दिया है, यह सुनिश्चित करने के लिए कि एक प्रक्रिया उस डेटा को नहीं पढ़ती है जो लिखा जा रहा है। खिड़की से बाहर "सुविधाजनक" फेंकने के लिए यह एक नाटक है। और perf मारो। –

+0

असुरक्षित कोड की तरह दिखता है और ब्लिटेबल structs जाने का रास्ता होगा ... धन्यवाद @usr। मैंने अपनी खोज में "असुरक्षित" भी शामिल करने के बाद यह पाया: http://stackoverflow.com/questions/7956167/how-can-i-quickly-read-bytes-from-a-memory-mapped-file-in-net – David

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