मैं एक डेल्फी एप्लिकेशन बना रहा हूं जो वैज्ञानिक सिमुलेशन करता है। जटिलता में बढ़ रहा है & में अब कई इकाइयां और रूप शामिल हैं।डेल्फी: EOutOfMemory त्रुटि को कैसे ढूंढें और ठीक करें?
मैं प्रत्येक बार चलाने के दौरान EOutOFMemory त्रुटियों को प्राप्त करना शुरू कर रहा हूं। ऐसा लगता है कि मैं अस्थायी रूप से एक फ़ंक्शन के भीतर संस्करण के ऐरे का उपयोग करने के दौरान या उसके बाद होता हूं। वास्तव में गूंगा सवाल पूछने के जोखिम पर, "संस्करण की सरणी" परेशानी के लिए पूछ रही है? (मैं सबकुछ स्ट्रिंग में बदल सकता हूं, लेकिन सिद्धांत में संस्करण की सरणी बहुत सारी चीजों को बचाती है)।
हमलावर सरणी उपयोग हो सकता है:
Function TProject.GetCurrentProjParamsAsArray(LProjectName, LProjectType : ShortString): ArrayOfVariant;
Var
ArrayIndex : Word;
begin
SetLength (Result,54);
ArrayIndex := 0;
Result [ArrayIndex] := LProjectName; Inc(ArrayIndex);
Result [ArrayIndex] := LProjectType; Inc(ArrayIndex); // this structure makes it easier to add extra fields in the DB than hard coding the array index!!
Result [ArrayIndex] := FileTool.DateTimeForFileNames ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. SiteName ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. PostCode ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. MetFileNamePath ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. SiteLat ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. SiteLong ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. SiteAlt ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. TZoneIndex ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. TZoneHours ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. TZoneMeridian ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. Albedo ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. ArrayTilt ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. ArrayAzimuth ; Inc(ArrayIndex);
कार्य प्रबंधक में - शिखर स्मृति उपयोग 42MB है, वीएम 31M है और मैं रन प्रति ~ 90,000 पेज दोष हो रही है। (साथ 3GB राम एक XP मशीन पर)
किसी को अपने आवेदन के भीतर विभिन्न घटकों द्वारा स्मृति के उपयोग की निगरानी पर किसी भी सामान्य युक्तियाँ है? या इस त्रुटि के कारण का पता लगाने पर?
हाल ही में मैं मुख्य परियोजना डेटा को एडीओ डीबी, का उपयोग करने के लिए सीएसवी के रूप में संग्रहीत करने से चला गया हूं, साथ ही साथ मैंने betweem स्ट्रिंग और सिंगल/डबल को हर समय परिवर्तित करने के बजाय वेरिएंट डेटा प्रकार का उपयोग शुरू कर दिया है।
मैं विभिन्न स्मृति बचत युक्तियाँ, जैसे जहां व्यावहारिक मैं Application.CreateForm (TProject, परियोजना) को हटा दिया है मैं मिल सकता है का पालन किया है; .dpr से बयान और गतिशील रूप से उन्हें बनाते हैं। (वैसे भी जहां फॉर्म का उपयोग ज्यादातर समय किया जा रहा है)। आम तौर पर मैं सबसे छोटी व्यावहारिक डेटाप्रकार (बाइट, shortstring, आदि) का उपयोग करें और, 'सार्वजनिक' चर & कार्यों
कोई सुझाव बहुत स्वागत के उपयोग को कम करने के ब्रायन
आप पृष्ठ दोष प्राप्त करने की उम्मीद करते हैं। इसके बारे में चिंता मत करो। एक 'संस्करण का सरणी' बहुत बुरा नहीं लगता है। आखिरकार आपके पास केवल सरणी में 54 तत्व हैं। 42 एमबी तुच्छ है। यह जानकारी देने के लिए लगभग असंभव है कि इस जानकारी को क्या चल रहा है। –
परिभाषित किया गया है 'ArrayOfVariant'? क्या आप सरणी या केवल साधारण प्रकार में वस्तुओं को संग्रहित कर रहे हैं? – RRUZ
ArrayOfVariant एक अलग उपयोगिता इकाई में यानी ArrayOfVariant = संस्करण की सरणी कार्यों के बीच जब से तुम नहीं कर सकते पास (परिभाषित किया गया है 'की सरणी ....'; यह केवल डबल और स्ट्रिंग मान शामिल – SolarBrian