2009-04-02 20 views
13

में मेमोरी उपयोग के साथ मुकाबला करने और कम करने, मेरे पास एक बहुत अधिक स्मृति (256 एमबी) नहीं है जिसमें मैं एसबीसीएल + हुनचेनॉट के साथ सामान्य लिस्प विकास के लिए कुछ सरल वेब-ऐप्स लिखने के लिए उपयोग करने की कोशिश कर रहा हूं । विशेष रूप से जटिल कुछ भी किए बिना स्मृति की एक बड़ी मात्रा का उपयोग किया जा रहा प्रतीत होता है, और पृष्ठों की सेवा के कुछ समय बाद यह स्मृति से बाहर हो जाता है और या तो सभी स्वैप का उपयोग करके पागल हो जाता है या (यदि कोई स्वैप नहीं है) बस मर जाता है।कॉमन लिस्प (एसबीसीएल)

तो मैं करने के लिए मदद की जरूरत है:

  • क्या सभी स्मृति उपयोग कर रहा है पता लगाएँ (अगर यह, पुस्तकालयों मैं हूँ या विशेष रूप से)
  • सीमा स्मृति की मात्रा जो SBCL उपयोग करने के लिए अनुमति दी है, से बचने के लिए स्वैपिंग की भारी मात्रा
  • दुर्घटनाग्रस्त होने की बजाय स्मृति समाप्त होने पर चीजों को साफ़ करें (क्योंकि यह एक वेब-ऐप है जिसे मैं इसे चालू करना चाहता हूं और साफ़ करने की कोशिश करता हूं)।

मुझे लगता है कि पहले दो उचित रूप से सीधा हैं, लेकिन तीसरा भी संभव है? लोग लिस्प में मेमोरी या बाधित स्मृति स्थितियों को कैसे संभालते हैं?

(साथ ही, मुझे लगता है कि एक 64-बिट एसबीसीएल सचमुच 32-बिट के रूप में दो गुना अधिक स्मृति का उपयोग करता प्रतीत होता है। क्या यह अपेक्षित है? यदि मैं बहुत मेमोरी बचाऊंगा तो मैं 32-बिट संस्करण चला सकता हूं)

उत्तर

13

एसबीसीएल के स्मृति उपयोग को सीमित करने के लिए, गतिशील-अंतरिक्ष-आकार विकल्प का उपयोग करें (उदाहरण के लिए, sbcl --dynamic-space-size 128 स्मृति उपयोग को 128 एम तक सीमित कर देगा)।

बाहर जो स्मृति उपयोग कर रहा है खोजने के लिए, आप (room) (समारोह बताता है कि कितना स्मृति का उपयोग किया जा रहा है) अलग अलग समय पर फोन कर सकते हैं: स्टार्टअप पर, के बाद सभी पुस्तकालयों लोड कर रहे हैं और उसके बाद (cource के काम के दौरान, फोन (sb-ext:gc :full t) कमरे से पहले कचरे को मापने के लिए जो अभी तक एकत्र नहीं किया गया है)।

इसके अलावा, स्मृति आवंटन को मापने के लिए एसबीसीएल प्रोफाइलर का उपयोग करना संभव है।

+0

क्या आप एसबीसीएल प्रोफाइलर के बारे में कुछ जोड़ने के लिए लिंक जोड़ सकते हैं? :) –

+2

एसबीसीएल मैनुअल में http://www.sbcl.org/manual/Deterministic-Profiler.html –

+0

पर प्रोफाइलर का विवरण बहुत बढ़िया है, धन्यवाद! –

1

मैं 64-बिट एसबीसीएल द्वारा दो बार गड़बड़ी का उपयोग करके आश्चर्यचकित नहीं होगा, क्योंकि यह शायद 32-बिट एक के बजाय 64-बिट सेल का उपयोग करेगा, लेकिन वास्तव में जांच किए बिना निश्चित रूप से नहीं कह सकता था।

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

3

यदि आपके पास कोई प्रकार की घोषणा नहीं है, तो मैं 64-बिट लिस्प को 32-बिट एक के स्थान पर दो बार लेने की अपेक्षा करता हूं। यहां तक ​​कि एक सादा (छोटा) int भी 64-बिट खंड की स्मृति का उपयोग करेगा। मुझे नहीं लगता कि यह एक मशीन शब्द से कम उपयोग करेगा, जब तक कि आप इसे घोषित न करें।

मैं # 2 और # 3 के साथ मदद नहीं कर सकता, लेकिन यदि आप # 1 को समझते हैं, तो मुझे संदेह है कि यह कोई समस्या नहीं होगी। मैंने एसबीसीएल/हुनचेनोट उदाहरणों को उम्र के लिए चल रहा है। अगर मैं एक अपमानजनक मात्रा में स्मृति का उपयोग कर रहा हूं, तो यह आमतौर पर मेरी अपनी गलती है। :-)

4

क्या (मुझे अगर यह पुस्तकालयों है या, विशेष रूप से) सभी स्मृति उपयोग कर रहा है

अट्टिला Lendvai पता लगाने के लिए जहां एक आवंटित वस्तुओं से आता है कुछ SBCL-विशिष्ट कोड है जानकारी प्राप्त करें ।http://article.gmane.org/gmane.lisp.steel-bank.devel/12903 का संदर्भ लें और यदि आवश्यक हो तो उसे एक निजी मेल लिखें।

यह सुनिश्चित करने के लिए कि एक कार्यान्वयन-विशिष्ट रिसाव न हो, एक सटीक जीसी (क्लोजर सीएल की तरह) के साथ अधिमानतः अन्य कार्यान्वयन का प्रयास करना सुनिश्चित करें।

सीमा स्मृति की मात्रा जो SBCL उपयोग करने के लिए अनुमति दी है,

पहले से ही दूसरों के द्वारा दिए अदला-बदली का भारी मात्रा में से बचने के लिए।

हैंडल बातें सफाई से जब स्मृति बाहर, बल्कि दुर्घटनाग्रस्त से चलाता है (क्योंकि यह है एक वेब अनुप्रयोग मैं इस पर ले जाने के लिए चाहते हैं और को साफ करने की कोशिश)।

256 एमबी तंग है, लेकिन वैसे भी: एक पुनरावर्ती (शायद 1 एस) समय थ्रेड शेड्यूल करें जो शेष खाली स्थान की जांच करता है। यदि फ्री स्पेस एक्स से कम है तो मौजूदा एसबीसीएल प्रक्रिया छवि को एक नए के साथ बदलने के लिए exec() का उपयोग करें।

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