मेरे पास कई बड़ी gzip फ़ाइलें (लगभग 10 एमबी - 200 एमबी) हैं जिन्हें मैंने ftp से डाउनलोड करने के लिए डाउनलोड किया है।जीजेआईपी डीकंप्रेशन सी # आउटऑफमेमरी
तो मैंने Google पर कोशिश की और gzip decompression के लिए कुछ समाधान ढूंढने की कोशिश की।
static byte[] Decompress(byte[] gzip)
{
using (GZipStream stream = new GZipStream(new MemoryStream(gzip), CompressionMode.Decompress))
{
const int size = 4096;
byte[] buffer = new byte[size];
using (MemoryStream memory = new MemoryStream())
{
int count = 0;
do
{
count = stream.Read(buffer, 0, size);
if (count > 0)
{
memory.Write(buffer, 0, count);
}
}
while (count > 0);
return memory.ToArray();
}
}
}
यह 50MB नीचे किसी भी फाइल के लिए अच्छी तरह से काम, लेकिन मैं स्मृति अपवाद से बाहर प्रणाली मिल गया है एक बार मैं 50MB से इनपुट अधिक है। अपवाद से पहले अंतिम स्थिति और स्मृति की लंबाई 134217728 है। मुझे नहीं लगता कि यह मेरी भौतिक स्मृति से संबंधित है, मैं समझता हूं कि 32-बिट का उपयोग करने के बाद से मुझे 2 जीबी से अधिक ऑब्जेक्ट नहीं हो सकता है।
मुझे फ़ाइलों को डिकंप्रेस करने के बाद भी डेटा को संसाधित करने की आवश्यकता है। मुझे यकीन नहीं है कि मेमोरी स्ट्रीम यहां सबसे अच्छा तरीका है लेकिन मुझे वास्तव में फ़ाइल में लिखना पसंद नहीं है और फिर फ़ाइलों को फिर से पढ़ें।
मेरे सवालों का
- कारण है कि मैं System.OutMemoryException मिला?
- gzip फ़ाइलों को डिकंप्रेस करने के लिए सबसे अच्छा संभव समाधान क्या है और बाद में कुछ टेक्स्ट प्रोसेसिंग करें?
आप स्ट्रीम की पूरी सामग्री को स्मृति में लोड कर रहे हैं और इसे बाइट सरणी के रूप में वापस कर रहे हैं। स्मृति अपवाद से बाहर * अन्य * की अपेक्षा आप और क्या करेंगे? आपको इसे सब कुछ स्मृति में लोड नहीं करना चाहिए - अंत में आप सरणी के साथ क्या करना चाहते हैं? इसे एक फाइल में लिखें? जो भी आप चाहते हैं, यह स्ट्रीम-आधारित होना चाहिए, और सरणी-आधारित नहीं होना चाहिए। –
अच्छी तरह से .. अपवाद स्मृति.write पर होता है और 134217728 में वहां अटक गया .. मैं स्मृति प्रबंधन से परिचित नहीं हूं, इसलिए कृपया मेरे साथ भालू। बाद में मैं सभी संसाधित फ़ाइलों को डेटाबेस में सहेज दूंगा, gzipped फ़ाइलों के अंदर फ़ाइल सीएसवी फ़ाइल –
निश्चित है, लेकिन अगर आप इसे संसाधित करते हैं तो आपका डिज़ाइन बेहतर होगा * जबकि * आप इसे अनजिप कर रहे हैं। इस तरह आपको इसे संभालने के लिए स्मृति का एक बड़ा हिस्सा आवंटित नहीं करना पड़ेगा। (उदाहरण के लिए, अपनी जीजीआईपी स्ट्रीम को सीधे 'स्ट्रीम रीडर' में फेंककर) –