2012-06-16 12 views
6

मैं कुछ विश्वविद्यालय परियोजना पर काम कर रहा हूं और स्मृति समस्या से फंस गया हूं।बड़े बिटमैप्स (3 जीबी तक) पर प्रसंस्करण

Bitmap bmp = new Bitmap(pathToFile); 

मुद्दा यह है कि नव निर्मित बिटमैप वस्तु रैम 3,5GB जो कुछ मैं नहीं समझ सकता है के बारे में उपयोग करता है (कि है: मैं एक बिटमैप जो नीचे दिए गए कोड के साथ HDD पर 1,5GB के बारे में लेता है लोड वास्तव में बड़ा रैपर: ई)। मुझे पिक्सेल सरणी पर जाना होगा, और बिटमैप क्लास का उपयोग वास्तव में सहायक है (मैं बाद में लॉकबिट्स() विधि का उपयोग करता हूं, और सर बाइट प्रति बाइट को संसाधित करता हूं) लेकिन इस मामले में यह कुल अवरोधक है। तो यहां मेरा प्रश्न है:

अतिरिक्त 2 जीबी उधार दिए बिना पिक्सेल सरणी निकालने का कोई आसान तरीका है?

मैं आवश्यक सरणी निकालने के लिए सी # का उपयोग कर रहा हूं, जिसे बाद में सी ++ में संसाधित किया जाता है - शायद मैं सी ++ में सभी आवश्यक डेटा निकाल सकता हूं (लेकिन रूपांतरण समस्या यहां दिखाई देती है - मैं 24 बीजीआर प्रारूप पर ध्यान केंद्रित कर रहा हूं)?

पीएस: मुझे पूरे बिटमैप को स्मृति में रखना होगा ताकि इसे भागों में विभाजित करना कोई समाधान न हो।

पीएस 2: बस कुछ मुद्दों को स्पष्ट करने के लिए: मुझे फ़ाइल एक्सटेंशन और फ़ाइल प्रारूप के बीच अंतर पता है। लोड की गई फ़ाइल असम्पीडित बिटमैप 3 बाइट्स प्रति पिक्सेल आकार ~ 1.42 जीबी (16k x 32k पिक्सेल) है, तो बिटमैप ऑब्जेक्ट दो गुना बड़ा क्यों है? किसी भी डिकंप्रेसरिंग मुद्दे और अन्य प्रारूप में कनवर्ट नहीं हो रहा है।

+0

संभावित डुप्लिकेट: [http://stackoverflow.com/questions/569889/how-do- i-use-big-bitmaps-in-net? rq = 1] (http://stackoverflow.com/questions/569889/how-do-i-use-large-bitmaps-in-net?rq=1) – Jason

+0

@ जेसन: हाँ, लेकिन उस प्रश्न का कोई वास्तविक जवाब नहीं है। पता नहीं क्यों उन्होंने स्मृति मैप की गई फ़ाइलों की निगरानी की है। –

+0

बिटमैप किस एन्कोडिंग का उपयोग करता है? क्या आरएलई संपीड़न है? –

उत्तर

1

अपने विशाल डेटा तक पहुंचने के लिए मेमोरी मैप की गई फ़ाइलों का उपयोग करने पर विचार करें :)। आपको जो चाहिए उस पर ध्यान केंद्रित करने वाला एक उदाहरण यहां पाया जा सकता है: http://visualstudiomagazine.com/articles/2010/06/23/memory-mapped-files.aspx यह प्रबंधित कोड में है लेकिन आप इसे समकक्ष मूल कोड से भी उपयोग कर सकते हैं।

मुझे बताएं कि आपको अधिक जानकारी चाहिए या नहीं।

+0

क्या आप अधिक विशिष्ट हो सकते हैं और दिखा सकते हैं कि इस विशेष मामले में इसका उपयोग कैसे किया जा सकता है? –

+0

ठीक है, आप बस मेमोरी मैप किए गए दृश्य के साथ बिटमैप को पार करते हैं, हिस्सों में डेटा पढ़ते हैं और इसे C++ भाग पर दबाते हैं। मुझे लगता है कि यह सी ++ में सब कुछ करने के लिए और अधिक कुशल हो सकता है और बिटमैप डेटा को संसाधित कर सकता है क्योंकि आप mem मैप किए गए फ़ाइल को पार करते हैं। –

+0

पूरी बात यह है कि एमएमएफ के साथ आप पूरे डेटा को स्मृति में लोड नहीं करते हैं। इसका बस एक छोटा सा हिस्सा। और आप वास्तव में देखभाल किए बिना इसके माध्यम से चल सकते हैं कि यह सब स्मृति में नहीं है। –

0

आप इस समाधान का उपयोग कर सकते हैं, सी # http://www.codeproject.com/Tips/240428/Work-with-bitmap-faster-with-Csharp

में तेजी से बिटमैप्स के साथ कार्य करें या आप उपयोग कर सकते हैं स्मृति मैप की गई फ़ाइलों

http://visualstudiomagazine.com/articles/2010/06/23/memory-mapped-files.aspx

0

आप स्मृति कैशिंग रोक सकता है।

के बजाय

Bitmap bmp = new Bitmap(pathToFile);

उपयोग

var bmp = (Bitmap)Image.FromStream(sourceFileStream, false, false);

https://stackoverflow.com/a/47424918/887092 देख