التعامل مع التقليل من استخدام الذاكرة في Common Lisp (SBCL)

StackOverflow https://stackoverflow.com/questions/708861

سؤال

لدي VPS مع ليس كثيرا جدا من الذاكرة (256) وأنا أحاول أن استخدام Common Lisp التنمية مع SBCL+Hunchentoot لكتابة بعض بسيطة ويب-تطبيقات.كمية كبيرة من الذاكرة يبدو أن التعود دون أن تفعل أي شيء معقد للغاية, و بعد فترة من التقديم صفحات نفاد الذاكرة و إما أن يذهب مجنون باستخدام جميع مبادلة أو (إذا كان هناك أي مقايضة) فقط يموت.

لذلك أنا بحاجة إلى المساعدة:

  • معرفة ما هو استخدام كافة الذاكرة (اذا كان المكتبات أو خاصة)
  • الحد من كمية الذاكرة التي SBCL يسمح استعمال لتجنب كميات هائلة من مبادلة
  • التعامل مع الأشياء نظيفة عندما نفدت الذاكرة بدلا من تحطمها (لأنه هو التطبيق على شبكة الإنترنت أريد أن تحمل على محاولة تنظيف).

أفترض الأولين معقولة واضحة ، ولكن هو ثالث ممكنا حتى ؟ كيف التعامل مع الناس خارج-من-الذاكرة أو مقيدة ظروف الذاكرة في Lisp ؟

(كما أود أن أشير إلى أن 64 بت SBCL يبدو أن استخدام حرفيا ضعف الذاكرة 32-بت.هذا هو المتوقع ؟ لا يمكن تشغيل إصدار 32 بت إذا كان سيوفر الكثير من الذاكرة)

هل كانت مفيدة؟

المحلول

للحد من استخدام الذاكرة SBCL ، استخدم --ديناميكية-المساحة-الحجم الخيار (على سبيل المثال ، sbcl --dynamic-space-size 128 سوف تحد من استخدام الذاكرة إلى 128).

لمعرفة من هو استخدام الذاكرة ، يمكنك االتصال (room) (وظيفة هذا يقول هو مقدار الذاكرة المستخدمة) في أوقات مختلفة:عند بدء التشغيل بعد كل المكتبات يتم تحميلها ثم أثناء العمل (من cource اتصل (sb-ext:gc :full t) قبل أن الغرفة لا قياس القمامة التي لم يتم جمعها).

أيضا من الممكن استخدام SBCL التعريف لقياس تخصيص الذاكرة.

نصائح أخرى

معرفة ما هو استخدام كافة الذاكرة (اذا كان المكتبات أو خاصة)

أتيلا Lendvai بعض SBCL-رمز معين لمعرفة المكان المخصص الكائنات يأتي من.الرجوع إلى http://article.gmane.org/gmane.lisp.steel-bank.devel/12903 و أكتب له رسالة البريد الخاصة إذا لزم الأمر.

تأكد من محاولة تنفيذ آخر ، ويفضل أن يكون ذلك مع دقيق GC (مثل Clozure CL) ضمان تنفيذ محددة تسرب.

الحد من كمية الذاكرة التي SBCL يسمح استعمال لتجنب ضخمة كميات من مبادلة

أجبت من قبل الآخرين.

التعامل مع الأشياء نظيفة عندما يدير الذاكرة بها, بدلا من تحطمها (لأنه ويب التطبيق أريد أن تحمل على محاولة لتنظيف).

256MB ضيق ، ولكن على أي حال:جدول متكرر (ربما 1s) توقيت الموضوع الذي يتحقق من المساحة الحرة المتبقية.إذا كانت المساحة الحرة أقل من X ثم استخدام exec() لتحل محل الحكومة الحالية SBCL العملية صورة مع واحدة جديدة.

وإذا لم يكن لديك أي نوع الإعلانات أتوقع 64 بت اللثغة أن تأخذ ضعف مساحة 32-بت واحد.حتى عادي (الصغيرة) الباحث استخدام إصدار 64-بت جزءا من الذاكرة.أنا لا أعتقد أنها سوف تستخدم أقل من آلة كلمة ، ما لم يعلن ذلك.

أنا لا يمكن أن تساعد مع #2 و #3, ولكن إذا كان يمكنك معرفة رقم 1 ، وأظن أنه لن يكون مشكلة.رأيت SBCL/Hunchentoot الحالات الترشح الأعمار.إذا أنا باستخدام الفاحشة مقدار الذاكرة, انها عادة ما تكون خطأي.:-)

وأود أن لا تفاجأ 64 بت SBCL باستخدام مرتين meory ، كما أنه من المحتمل استخدام إصدار 64-بت الخلية بدلا من 32 بت واحد ولكن لا يمكن الجزم في الواقع دون فحص.

نموذجية الأشياء التي تبقى ذاكرة معلقة حول لفترة أطول من المتوقعة هي لم تعد مفيدة المراجع التي لا تزال لديها طريق الجذر تخصيص مجموعة (تجزئة الجداول أجد وسيلة جيدة من ترك هذه الأمور باقية).قد تتمكن من محاولة التبعثر صريحة تدعو إلى GC في التعليمات البرمجية الخاصة بك وتأكد من أن (قدر الإمكان) عدم تخزين الأشياء في المتغيرات العالمية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top