2011-04-24 14 views
15

मान लें कि मैं इसपुन: उपयोग मेमोरी स्ट्रीम

memoryStream.Read(data, 0, data.Length); 

का उपयोग कर एक स्मृति धारा में एक बाइट बफर की नकल की है वहाँ मेरे लिए किसी भी तरह से धारा खाली और यह पुन: उपयोग अतिरिक्त डेटा को पढ़ने के लिए करने के लिए है?

मैं कई MemoryStream वस्तुओं बनाने से बचें और एक उदाहरण का उपयोग करना पसंद करना चाहते हैं, उपयोगों

उत्तर

16

के बीच में रीसेट आप Position 0, प्रभाव में इस वसीयत धारा रीसेट सेट कर सकते हैं।

हालांकि, this उत्तर के रूप में इंगित करता है कि स्मृति धाराओं का पुन: उपयोग करने से आपको कोई प्रदर्शन लाभ नहीं मिलेगा। अधिक मेमोरी स्ट्रीम बनाने के लिए सस्ता है।

पुन: उपयोग के लिए आपके बफर के रूप में पिन किए गए byte[] का उपयोग करने का एक और विकल्प।

+1

ज़रूर से सहमत - लेकिन अगर धारा पहले से ही 100 बाइट का है और मैं 99 बाइट्स तो लिखने जब मैं इस धारा मैंने पढ़ा होगा की सामग्री पढ़ने के लिए आते हैं बहुत अधिक :) –

+1

@CycleMachine - एक कारण है कि स्मृति स्ट्रीम को रीसेट/समाशोधन क्यों नहीं बनाया गया है। मैंने जो लिंक जोड़ा है उसे देखें। – Oded

+3

यदि आप एक बड़ा बफर आवंटित करते हैं तो यह बफर बनाम हर बार पुन: उपयोग करने के लिए अधिक कुशल होगा। स्थिति को सेट करने के बजाय आप सेटलेथेंथ (0) का उपयोग कर सकते हैं (नीचे मेरा जवाब देखें) जो बफर को आवंटित करेगा और आंतरिक काउंटर, लंबाई और स्थिति को रीसेट करेगा, जो अक्सर एक बड़े बफर को फिर से आवंटित करने से सस्ता है। –

-1

मेमोरीस्ट्रीम .eek (0, SeekOrigin.Begin);

19

आप 0 करने के लिए स्थिति और 0.

MemoryStream ms = new MemoryStream(); 

// Do some stuff with the stream 

// Reset the stream so you can re-use it 
ms.Position = 0; // Not actually needed, SetLength(0) will reset the Position anyway 
ms.SetLength(0); 

// Do some more stuff with the stream 

को लंबाई 0 लंबाई की स्थापना करके आप मौजूदा बफर स्पष्ट नहीं है की स्थापना द्वारा MemoryStream फिर से उपयोग कर सकते हैं, यह केवल आंतरिक काउंटर रीसेट करता है । तो मौजूदा बफर आवंटन बरकरार रहता है, लेकिन बफर का कितना उपयोग किया जाता है, इस पर ध्यान रखने वाली सभी पुस्तकें रीसेट कर दी गई हैं ताकि आप इसका पुन: उपयोग कर सकें।

अपडेट: मैंने सेटलेथैथ के लिए कोड कार्यान्वयन पर तुरंत एक त्वरित नज़र डाली और यदि आप लंबाई 0 को सेट करते हैं तो स्थिति स्वचालित रूप से 0 पर रीसेट हो जाएगी, इसलिए आपको स्थिति संपत्ति को स्पष्ट रूप से सेट करने की भी आवश्यकता नहीं है बस लंबाई को रीसेट करने के लिए पर्याप्त है।

0

अगर आप सीधे तक पहुँचने byte[] डेटा के लिए (सीमाओं का पता लगाने के लिए उपयोग memoryStream.Position और memoryStream.Length) memoryStream.getBuffer() और ऑफसेट/लंबाई का उपयोग बेहतर होगा, Reader/Writer/BinaryFormatter कक्षाएं, या अन्य वर्गों Stream को स्वीकार करने, पढ़ने के लिए/लिख आदिम/बफर में जटिल प्रकार (यही MemoryStream के लिए बनाया गया है), आप बेकार प्रतिलिपि संचालन के बिना प्रबंधित करते हैं, क्योंकि MemoryStream पहले से ही बाइट-सरणी पर आधारित है।

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

मैंने MemoryStream के MemoryStream के स्रोत कोड (एक Array.Clear कॉल SetLength(), और .NET के आंतरिक वर्गों के बिना प्रबंधित करने के लिए कुछ अतिरिक्त) को संशोधित करके इस समस्या को हल किया और इसे मेरे प्रोजेक्ट में उपयोग करके हल किया।

MemoryStream पुन: उपयोग के लिए के रूप में, मैं क्रिस टेलर के जवाब (SetLength(0))

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