2010-06-21 22 views
7

मैं एक आईएसटी स्ट्रीम का उपयोग कर COM स्वचालन के माध्यम से डेटा की बड़ी मात्रा को स्थानांतरित करने के लिए एक सी # कक्षा पुस्तकालय लिख रहा हूं। यह स्ट्रीम बनाने के लिए CreateStreamOnHGlobal एपीआई कॉल का उपयोग करता है, और इसके साथ काम करने के लिए System.Runtime.InteropServices.COMTypes.IStream के तरीकों का उपयोग करता है।बड़े ISTreams को प्रबंधित करने का सही तरीका क्या है?

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

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

+0

कहाँ से आती है? स्मृति में * सब कुछ * स्टोर करना दुर्लभ है। आप निश्चित रूप से केवल पढ़ने() विधि कार्यान्वयन में इसे पढ़ सकते हैं? –

+0

डीबी टेबल और टेक्स्ट फाइलों सहित विभिन्न स्रोतों से। लाइब्रेरी कोड डेटा को बाइट सरणी में पार्स करता है और इसे स्ट्रीम में स्थानांतरित करता है। मैं इसे छोटे हिस्सों में पढ़/लिख सकता हूं, यह कोई समस्या नहीं है। मुद्दा यह है कि, जैसा कि मैं धारा के अंत में लिखता रहता हूं, यह लगातार बढ़ेगा, है ना? – polara

+2

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

उत्तर

0

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

यदि आप .NET 4.0 का उपयोग कर रहे हैं तो आपको स्मृति मैप की गई फ़ाइलों के लिए managed API मिला है।

1

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

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

बड़े डेटा और स्ट्रीमिंग => http://msdn.microsoft.com/en-us/library/ms733742.aspx

0

हर धारा बफर पर कार्यान्वयन realies। अधिकांश समय आपके पास बफर आकार पर 100% नियंत्रण होगा। आप प्रदर्शन बनाम स्मृति उपयोग संतुलन के लिए ट्यून करने के लिए बफर आकार समायोजित कर सकते हैं। आप एक ही समय में धारा के सैकड़ों खोलने नहीं कर रहे हैं मेरा सुझाव उदार धारा आकार संभव के रूप में बड़ा हो सकता है:

वर readStream = नए System.IO.File.OpenRead (sourceFilePath); var writeStream = new System.Io.File.Create (destinationFile);

बाइट [] बफर = नए बाइट्स [बफर आकार]; int readLength; जबकि ((readLength = readStream.Read (0,0, बफर आकार))> 0) {
writeStream.Write (बफर, 0, readLength); }

writeStream.Close(); readStream.Close();

1

विशेषताएँ FILE_ATTRIBUTE_TEMPORARY और FILE_FLAG_DELETE_ON_CLOSE के साथ बनाई गई फ़ाइल का उपयोग करने पर विचार करें। वहां आपको सामान लिखें। विंडोज़ डिस्क कैश में रखने की कोशिश करेगा जब तक कि स्मृति समाप्त न हो जाए। जब आप हैंडल बंद करते हैं या जब आपका प्रोग्राम समाप्त होता है (या दुर्घटनाग्रस्त हो जाता है) तो यह स्वयं को नष्ट कर देगा। मैंने इसके बारे में here सीखा।

0

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

एक और संभावित समाधान बड़े संदेश को टुकड़ों नामक छोटे संदेशों में विभाजित करना है, उन हिस्सों को एक समय में एक हिस्सा भेजना, और प्राप्त करने वाले पक्ष पर बड़े संदेश का पुनर्निर्माण करना है। एप्लिकेशन स्वयं ही इस चंकिंग और डी-चंकिंग कर सकता है या यह करने के लिए एक कस्टम चैनल का उपयोग कर सकता है। चंकिंग चैनल नमूना दिखाता है कि कैसे एक कस्टम प्रोटोकॉल या स्तरित चैनल का उपयोग मनमाने ढंग से बड़े संदेशों के खंडन और डी-चंकिंग करने के लिए किया जा सकता है।

नमूना प्रदान की डाउनलोड उपलब्ध http://msdn.microsoft.com/en-us/library/aa717050.aspx

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

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