मुझे एक समस्या है जो मुझे कुछ दिनों के लिए परेशान कर रही है। मैंने Google को समस्या का प्रयास करने की कोशिश की है, लेकिन अभी तक कोई समाधान नहीं मिला है, एक ही समस्या वाले एक व्यक्ति भी नहीं।सी # System.Buffer.BlockCopy मेमोरी समस्या?
ऐसा लगता है कि सी # विधि सिस्टम.बफर.ब्लॉककॉपी आपको कुछ प्रकार के मेमोरी भूत के साथ छोड़ देता है। मेरे पास उदाहरण के लिए इस विधि है:
private float[,] readFloatArray2 (byte[] b) {
int floatSize = sizeof(float);
float[,] v = new float[2, (b.Length/2)/floatSize];
System.Buffer.BlockCopy(b, 0, v, 0, b.Length);
return v;
}
एक बाइट सरणी को 2 डी फ्लोट सरणी में परिवर्तित करने के लिए। डेटा पहले एक स्ट्रीम से पढ़ा जाता है। मैंने सिस्टम.बफर.ब्लॉककॉपी विधि होने की समस्या को हल किया है।
यदि मैं ब्लॉककॉपी कमांड को हटा देता हूं, तो एप्लिकेशन द्वारा उपयोग की जाने वाली मेमोरी आधा आकार होगी। इसका मतलब है कि यह मेरी गलती नहीं है कि बाइट सरणी अभी भी जीवित है। क्योंकि BlockCopy कमांड के बिना, बाइट सरणी ठीक से मर जाती है। फ्लोट सरणी वैसे भी बनाई जाती है (कॉपी की गई जानकारी के साथ या उसके बिना)।
मुझे यकीन नहीं है कि यह ब्लॉककॉपी कमांड या जीसी की समस्या है क्योंकि मैंने System.GC.Collect() को कॉल करने का भी प्रयास किया है; ब्लॉककॉपी के बाद और फिर यह पूरी तरह से काम करता है (मुझे पता है कि आपको यह नहीं करना चाहिए ... यही कारण है कि मैं यहां सलाह देने के लिए कह रहा हूं)।
मैं भी पूछना परेशान नहीं करता, लेकिन इस मुद्दे में कई सौ मेग शामिल हैं।
स्मृति समस्याओं के अलावा, विधि पूरी तरह ठीक काम करती है। क्या किसी को पता है कि स्मृति समस्या का कारण क्या है?
बधाई और अग्रिम धन्यवाद ओली
ps: मैं दृश्य स्टूडियो 2010 प्रो और Win7 के साथ .NET4.0 उपयोग कर रहा हूँ ... पता नहीं है कि क्या यह प्रासंगिक है या नहीं।
यदि आप कहते हैं कि स्मृति 'जीसी.कोलेक्ट' द्वारा ठीक से एकत्र की जाती है तो सब कुछ ठीक है। समय बी आने पर 'बी' * * अंततः एक सामान्य जीसी द्वारा एकत्र किया जाएगा। –
यदि आप ऑडियो डेटा पर काम कर रहे हैं, तो मैं 'फ्लोट [लेन] [चैनलकाउंट]' फॉर्म की एक जंजीर सरणी का उपयोग करूंगा। इस तरह आप चैनलों को अलग से इलाज कर सकते हैं, जो कभी-कभी उपयोगी होता है। – CodesInChaos
"फ्लोट सरणी वैसे भी बनाई जाती है" केवल आधे सच। इसे अभी तक भौतिक स्मृति की आवश्यकता नहीं है। मेमोरी पेज जो सभी 0 हैं और कभी भी लिखे गए नहीं हैं, विंडोज मेमोरी मैनेजर द्वारा अनुकूलित किए गए हैं। – CodesInChaos