2013-02-20 16 views
5

बचाता है मैं asp.net + C# में .xlsx फ़ाइल बनाने के लिए EPPlus लाइब्रेरी का उपयोग कर रहा हूं। मेरी फ़ाइल में कुछ मिलियन रिकॉर्ड हो सकते हैं और मैं प्रति 100K रिकॉर्ड एक ExcelWorksheet बना रहा हूं। समस्या यह है कि 40Mb xlsx जिसमें लगभग 1.5M रिकॉर्ड हैं, मेरे मुख्य मेमोरी के कई जीबीएस रिकॉर्ड करते हैं और उसके बाद मुझे OutOfMemoryException मिलता है, प्रश्न यह है: मैं X Gb for 40M? को ले जाने वाली मेमोरी को कैसे कम कर सकता हूं: - | या ExcelPackage धीरे-धीरे सहेजें और स्मृति को हटा दें, (ऐसा लगता है कि मैं एक से अधिक बार सहेज नहीं सकता और पूरे पैकेज के बाद इसका निपटारा किया जा सकता है)।ईपीप्लस एकाधिक

अगर वहाँ कोई समाधान नहीं है, किसी को भी

+0

एक सप्ताह के बाद कोई जवाब नहीं? –

+1

यह एक बहुत ही आम मुद्दा है। ईपीप्लस एक महान पुस्तकालय है, लेकिन जब बड़ी फाइलें लिखने की बात आती है, तो स्मृति खपत एक बड़ी समस्या है :( – SharpCoder

+0

क्या आपको .NET? –

उत्तर

4

यह समस्या EPPlus (4.0.x) के नवीनतम संस्करण में हल किया जा करने के लिए


संपादित लगता है।

https://epplus.codeplex.com/releases/view/118053#ReviewsAnchor समीक्षा 4.x संस्करण में सुधार स्मृति प्रदर्शन के बारे में उपयोगकर्ताओं द्वारा 3.x संस्करण की तुलना में।

https://epplus.codeplex.com/wikipage?title=Roadmap संस्करण 4.0: नई cellstore डालने में सुधार, प्रदर्शन और स्मृति की खपत

हटाना यह लिंक सुनिश्चित करने के बारे लोड हो रहा है कोशिकाओं की भारी संख्या अनुकूलित है बताते हैं करने के लिए।

http://epplus.codeplex.com/wikipage?title=FAQ&referringTitle=Documentation खंड का संदर्भ लें "मेरे पास बहुत सारे डेटा हैं जिन्हें मैं लोड करना चाहता हूं। मुझे सर्वश्रेष्ठ प्रदर्शन प्राप्त करने के बारे में क्या सोचना चाहिए?"

इसके अलावा, मैंने व्यक्तिगत रूप से ईपीप्लस 4.0.4 का परीक्षण किया है, एक बार में 1.5 मिलियन रिकॉर्ड लिखकर, 5 संख्यात्मक पंक्तियों और 1 डेटटाइम पंक्ति, और विंडोज टास्क मैनेजर द्वारा रिपोर्ट की गई पीक मेमोरी वर्किंग सेट सिर्फ 711 थी एमबी। विंडोज टास्क मैनेजर द्वारा दिखाया गया गैर-पेज्ड पूल सिर्फ 75 के या उससे भी कम था! बेशक, मुझे यकीन नहीं है कि ये संख्याएं स्मृति पदचिह्न के पूर्ण प्रभाव को कैप्चर करती हैं, लेकिन ये संकेतक हैं। आउटपुट एक्सेल फ़ाइल लगभग 5 9 एमबी थी (हो सकता है कि मेरे कॉलम आपके मूल पोस्ट में आपके द्वारा उल्लिखित नमूना डेटा से अधिक थे।)

नोट: मुझे 4.5 मिलियन रिकॉर्ड लिखने का प्रयास करने पर "आउटऑफमेमरी अपवाद" मिला एक बार में 7 कॉलम!

क्या मेरा परीक्षण पर्याप्त कठोर है? शायद नहीं ... हालांकि मेरे लिए अच्छा काम करता है।


हालांकि, एक वैकल्पिक हल मैं पिछले संस्करणों में बड़े स्मृति आवश्यकताओं को दूर करने के बारे में सोच सकता है विभाजित है और हर 100K रिकॉर्ड के लिए एक xlsx फ़ाइल को बचाने के लिए है। सहेजने के बाद, अगले 100 के रिकॉर्ड के लिए एक नई फ़ाइल (उचित फ़ाइल नाम काउंटर वृद्धि के साथ) का उपयोग शुरू करें।

आपके ऑपरेशन के अंत में, आप कुल 1 मिलियन रिकॉर्ड कहने के लिए 100 के रिकॉर्ड की 10 फाइलें समाप्त कर देंगे।

थोड़ा हैक लगता है, लेकिन हे, कुछ अन्य लाइब्रेरी (मुफ्त या वाणिज्यिक) का उपयोग करने के लिए अपने कोड बेस को फिर से लिखने से बेहतर हो सकता है।

+0

मैंने सवाल पूछने से पहले इस कामकाज का उपयोग किया है। यह काम करता है, लेकिन सबसे अच्छा जवाब नहीं है। क्या आप हल की गई समस्या या पृष्ठ के लिए सटीक लिंक प्रदाता कर सकते हैं जिसने नई सुविधा का वर्णन किया है? तो मैं मैं आपको सबसे अच्छे उत्तर के रूप में चिह्नित करता हूं –

+0

मैंने अपने मूल उत्तर के लिंक जोड़े हैं .. –

+0

आपके उत्तर के लिए धन्यवाद, इसे चिह्नित करें;) –

4

एकाधिक बचाता मदद नहीं करेगा (लगभग सभी और आदि स्टाइल, कार्यपत्रक जैसी सुविधाओं के साथ) EPPlus के लिए एक विकल्प लागू कर सकते हैं। यदि आप अपनी निर्यात प्रक्रिया के बीच फ़ाइल को सहेजने और बंद करने का प्रयास करते हैं, तो कचरा संग्रह का आह्वान करें, आप देखेंगे कि उपभोग की गई स्मृति को मुक्त कर दिया जाएगा। लेकिन यदि आप फिर फ़ाइल को फिर से खोलने का प्रयास करेंगे, तो प्रक्रिया द्वारा उसी मात्रा में स्मृति का उपभोग किया जाएगा। और यदि आप अपनी निर्यात प्रसंस्करण जारी रखने का प्रयास करते हैं, तो आप एक ही समस्या में फिर से आ जाएंगे।

AFAIK ओपन एक्सएमएल एसडीके पर आधारित सभी आधुनिक .NET पुस्तकालय स्मृति में प्रसंस्करण निष्पादित करते हैं। तो EpPlus करो। स्मृति में लोड किए बिना हार्ड डिस्क पर प्रसंस्करण करने का एकमात्र तरीका है। पृष्ठों EPPlus 4.0.4 में स्मृति प्रबंधन में सुधार के लिए जो बात करने के लिए जोड़ा जा रहा है संदर्भ लिंक:

+0

आपका उत्तर तर्कसंगत और सही है। लेकिन मैं इस उत्तर को स्वीकार नहीं कर सकता क्योंकि मेरा मुख्य प्रश्न अभी भी अनुत्तरित नहीं है, "क्या कोई विकल्प है?" –

+0

I आपके सूचनात्मक उत्तर के लिए एक उत्थान किया गया –

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