के साथ बहुत बड़े स्थिरांक संकलित आज मैंने जीएचसी से 8 एमबी हास्केल स्रोत फ़ाइल संकलित करने के लिए कहा। जीएचसी ने लगभग 6 मिनट के लिए इसके बारे में सोचा, लगभग 2 जीबी रैम निगल लिया, और फिर आखिरकार एक आउट-ऑफ-मेमोरी त्रुटि छोड़ दी।जीएचसी
[एक अलग रूप में के रूप में, मैं कर रहा हूँ खुशी है कि GHC बल्कि मंजिल से मेरे पूरे पीसी निरस्त करने के लिए अच्छी समझ थी।]
मूल रूप से मैं एक प्रोग्राम है जो एक पाठ फ़ाइल पढ़ता है मिल गया है, कुछ फैंसी पार्स करता है, एक डेटा संरचना बनाता है और फिर फ़ाइल में डंप करने के लिए show
का उपयोग करता है। मेरे अंतिम आवेदन में संपूर्ण पार्सर और स्रोत डेटा को शामिल करने के बजाय, मैं जेनरेट किए गए डेटा को संकलन-समय निरंतर के रूप में शामिल करना चाहता हूं। show
से आउटपुट में कुछ अतिरिक्त सामान जोड़कर, आप इसे एक वैध हास्केल मॉड्यूल बना सकते हैं। लेकिन जीएचसी स्पष्ट रूप से बहु-एमबी स्रोत फ़ाइलों को संकलित करने का आनंद नहीं लेता है।
(अजीब हिस्सा है, अगर आप सिर्फ read
डेटा वापस, यह वास्तव में बहुत ज्यादा नहीं समय या स्मृति ले करता है। अजीब, यह देखते हुए कि दोनों String
आई/ओ और read
माना जाता है कि बहुत अक्षम हैं ...)
मुझे अस्पष्टता से याद है कि अन्य लोगों को अतीत में बड़ी फ़ाइलों को संकलित करने के लिए जीएचसी प्राप्त करने में परेशानी हुई है। एफडब्ल्यूआईडब्ल्यू, मैंने -O0
का उपयोग करने की कोशिश की, जिसने दुर्घटना तेज कर दी लेकिन इसे रोक नहीं दिया। तो हैस्केल प्रोग्राम में बड़े संकलन-समय स्थिरांक को शामिल करने का सबसे अच्छा तरीका है?
(मेरे मामले में, लगातार सिर्फ कुछ रोचक लेबल के साथ एक नेस्टेड Data.Map
है।)
शुरू में मैंने सोचा था कि GHC केवल एक पंक्ति है कि अस्सी लाख वर्ण लंबा से मिलकर एक मॉड्यूल पढ़ने से नाखुश हो सकता है। (!!) लेआउट नियम या ऐसे के साथ कुछ करना है। या शायद गहराई से घिरे अभिव्यक्ति इसे परेशान करते हैं। लेकिन मैंने प्रत्येक सबएक्सप्रेस को एक शीर्ष-स्तरीय पहचानकर्ता बनाने की कोशिश की, और यह कोई मदद नहीं थी। (प्रत्येक पर स्पष्ट प्रकार के हस्ताक्षर जोड़ना संकलक को थोड़ा अधिक खुश करने के लिए प्रतीत होता है।) क्या कुछ और है जो मैं संकलक के काम को सरल बनाने की कोशिश कर सकता हूं?
अंत में, मैं डेटा-संरचना बनाने में सक्षम था, मैं वास्तव में बहुत छोटा स्टोर करने की कोशिश कर रहा हूं। (जैसे, 300 केबी।) इसने जीएचसी को बहुत खुश कर दिया। (और अंतिम आवेदन बहुत तेज है।) लेकिन भविष्य के संदर्भ के लिए, मुझे यह जानने में दिलचस्पी होगी कि इस तक पहुंचने का सबसे अच्छा तरीका क्या है।
मुझे यह भी मानकर पकड़ा गया है कि मेरे डेटा को स्रोत कोड में रखना बेहतर होगा, केवल यह पता लगाने के लिए कि यह रनटाइम पर फ़ाइल से इसे पढ़ने के लिए __much__ तेज़ था। – AndrewC
या, यदि आप एक फ़ाइल में डेटा और प्रोग्राम को बंडल करना चाहते हैं, तो आप इसे एक स्ट्रिंग स्थिर के रूप में शामिल कर सकते हैं जो कि 'अतिरिक्त' में से कोई अतिरिक्त फ़ाइल IO नहीं है। जीएचसी मेरे लैपटॉप पर 50 एमबी की स्ट्रिंग वाली फाइलों को संकलित करेगा। – leftaroundabout
मुझे याद है कि जीएचसी को हमेशा लंबी शाब्दिक सूचियों और इस तरह की समस्याओं को संकलित करने में समस्याएं थीं। हालांकि, हालिया टिकट या मेलिंग सूची थ्रेड किसी भी प्रकार के विवरण में नहीं जा रहा है। –