سؤال

وأنا استضافة و IronPython في ج و# المستندة إلى خدمة ويب لتكون قادرة على توفير البرامج النصية تمديد المخصصة. ومع ذلك، أنا وجدت أن استخدام الذاكرة يزيد بشكل حاد عندما أفعل اختبار الحمل بسيطة عن طريق تنفيذ خدمة ويب مرارا وتكرارا في حلقة.

و IronPython 1.1 تنفذ IDisposable على كائناتها بحيث يمكنك التخلص منها عندما يتم القيام به. وو IronPython-2 محرك جديد يستند إلى DLR لا يوجد لديه مثل هذا المفهوم.

ومن ما فهمت، في كل مرة تقوم بتنفيذ برنامج نصي في ScriptEngine يتم حقن البرلمان الجديد في في AppDomain ولا يمكن تفريغها.

هل هناك أي وسيلة للتغلب على هذه؟

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

المحلول 3

وتبين، بعد غروب aspnet_wp إلى حوالي 500MB، وركلات جمع القمامة في وينظف بها الفوضى. ثم يسقط استخدام الذاكرة إلى حوالي 20MB ويبدأ زيادة مطردة مرة أخرى أثناء اختبار الحمل. لذلك ليس هناك ذاكرة "تسرب" على هذا النحو.

نصائح أخرى

هل يمكن أن تحاول خلق AppDomain جديد في كل مرة تقوم بتشغيل أحد البرامج النصية و IronPython الخاص بك. وعلى الرغم من assebmlies لا يمكن تفريغها من الذاكرة يمكنك إلغاء تحميل AppDomain وهذا سوف يسمح لك للحصول على التجمع حقن من الذاكرة.

وتحتاج إلى تعطيل الجيل رمز الأمثل:

var runtime = Python.CreateRuntime();
var engine = runtime.GetEngine("py");
PythonCompilerOptions pco = (PythonCompilerOptions)engine.GetCompilerOptions();
pco.Module &= ~ModuleOptions.Optimized;

// this shouldn't leak now
while(true) {
   var code = engine.CreateScriptSourceFromString("1.0+2.0").Compile(pco);
   code.Execute();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top