2011-10-21 15 views
6

का उपयोग कर बड़ी ज़िप फ़ाइल बनाते समय मैं OutOfMemoryException डीबग करने का प्रयास कर रहा हूं जो System.IO.Packaging.ZipPackage का उपयोग करके काफी बड़ी ZIP फ़ाइल बनाते समय होता है।OutOfMemoryException System.IO.Packaging

कोड ऑब्जेक्ट की एक बड़ी सूची के माध्यम से पुनरावृत्ति कर रहा है, प्रत्येक ऑब्जेक्ट के लिए निम्नलिखित कर रहा है।

  1. ऑब्जेक्ट डेटा को एक अस्थायी फ़ाइल में क्रमबद्ध करना।
  2. फ़ाइल के लिए कोई PackagePart बना रहा है।
  3. एक स्रोत System.IO.Stream से दूसरे में कॉपी:
    • स्रोत धारा: FileStream
    • लक्ष्य धारा: PackagePart::GetStream() =>MS.Internal.IO.Zip.ZipIOModeEnforcingStream

अंत में यह Package::Close() जो फ़ाइल की बचत होती है कहता है।

मेरी समस्या यह है कि वस्तुओं की विशेष रूप से बड़ी सूची के लिए, मुझे OutOfMemoryException (x86 प्रक्रिया आकार आकार में 1.2 जीबी तक पहुंच रहा है) देख रहा है।

मैं ऑब्जेक्ट डेटा को टुकड़ों में विभाजित करने के बारे में सोच रहा था, इसलिए मैं केवल प्रति लूप (यानी ऊपर 1-3 कदम) को संसाधित करता हूं। विचार यह है कि मैं एक अस्थायी निर्देशिका में n ज़िप फ़ाइलों को बनाने के हैं, और फिर उन्हें एकल आर्काइव में गठबंधन करने के लिए एक रास्ता खोजने है।

क्या यह System.IO.Packaging का उपयोग कर संभव है? भागों को गठबंधन करने के लिए मैं क्या उपयोग करूंगा?

या तो इसे ठीक करने के लिए एक बेहतर तरीका है?

+0

नया पैकेज बनाते समय पुनरावृत्ति के बीच फ्लश को कॉल करने का प्रयास करें – Ankur

+0

@ अंकुर - आपने इसे खींचा है, यह चाल चल रहा था। यदि आप अपनी टिप्पणी को किसी उत्तर में अपग्रेड करते हैं, तो मुझे इसे स्वीकार करने में खुशी होगी। – LeopardSkinPillBoxHat

उत्तर

3

पैकेज पैकेज पर Flush विधि को एक नया पैकेज बनाने के बीच कॉल करना संभवतः समस्या को हल करना चाहिए क्योंकि स्मृति मेमोरी को डिस्क पर फ़्लश किया जाएगा।

+0

धन्यवाद - यह मेरे लिए काम किया। मैं ज़िप फ़ाइल में जोड़े गए प्रत्येक 500 फाइलों के बीच इसे फ़्लश कर रहा था। यह स्मृति और प्रदर्शन के बीच एक अच्छा व्यापार था। – LeopardSkinPillBoxHat

0

मैं डॉटनेटजिप लाइब्रेरी (http://dotnetzip.codeplex.com/) का उपयोग करूंगा। मैं (SharpZibLib System.IO की तरह आप वर्तमान में उपयोग कर रहे हैं और यह भी) कई जिप पुस्तकालयों की कोशिश की है और दूर सबसे आसान उपयोग करने के लिए द्वारा DotNetZip पुस्तकालय है।

आप लगभग निश्चित रूप से कोड की कम लाइनों के साथ समाप्त हो जाएंगे और मुझे स्मृति उपयोग बहुत अच्छा लगता है (वर्चुअल मशीन वातावरण में एक समस्या थी जो मैंने रिपोर्ट की थी और एक नई रिलीज इसे ठीक कर दिया था)।

+0

मेरे मूल प्रश्न यह बारे में बहुत स्पष्ट नहीं था, लेकिन यह वास्तव में मौजूदा कोड में एक दोष है और मैं इस कोड को बहुत ज्यादा (मैं तो बस दुर्घटना को ठीक करना चाहते हैं) को फिर से लिखना करने के लिए नहीं चाहता था। मैंने इसे और स्पष्ट करने के लिए प्रश्न संपादित किया। – LeopardSkinPillBoxHat