سه راهکار عمده جهت رفع خطای کمبود حافظه در نرم افزار CPLEX

در پست قبلی اشاره شد که چه عواملی منجر به ایجاد خطای کمبود حافظه (out of memory) در نرم افزار IBM Ilog CPLEX می‌شود. در این پست سه راهکار عمده جهت برطرف‌سازی این خطا را بررسی می کنیم. اولین و ساده‌ترین راهکار ممکن تغییر پارامتر thread به مقدار ۱ است. برای این منظور کافی است که یک بلوک پیش‌پردازنده‌ی execute به صورت زیر در ابتدای کد قرار داده شود.

execute {
 cplex.threads = 1;
}

با انجام این عمل، پردازش از حالت موازی خارج شده و جستجو به صورت تک نخی (single threading) صورت می‌گیرد. در این حالت به حجم حوضچه‌ی جواب (solution pool) کمتری نیاز خواهد بود.

راهکار بعدی اجازه دسترسی به مقدار بیشتری از حافظه موقت (RAM) هست. در حالت عادی نرم افزار تنها اجازه‌ی دسترسی به ۲ گیگابایت از فضای موقت را دارد.

execute {
 cplex.workmem = 4000;
}

راهکار سوم تغییر پارامتر‌های الگوریتم حل است که اغلب با سعی و خطا همراه می‌شود. به عنوان مثال تغییر پارامتر lpmethod از مقدار یک به دو، نوع الگوریتم حل را از سیمپلکس عادی به الگوریتم سیمپلکس-دوال تغییر می دهد. در عمل ثابت شده است که الگوریتم‌های سیمپلکس-دوال نسبت به سایر الگوریتم‌های برنامه‌ریزی خطی، در حین اجرا فضای کمتری را اشغال می‌کنند.

execute {
 cplex.lpmethod = 1;
}

خطای کمبود حافظه در CPLEX چه زمانی رخ می دهد؟

یکی از پارامترهای مهم مدیریت کدهای توسعه داده‌شده در نرم‌افزار CPLEX، مدیریت حافظه آنها است. یکی از خطاهای عمده که معمولا در مدل‌های با مقیاس بالا ممکن است رخ می‌دهد، خطای حافظه‌ی خارج از دسترسی (out of memory) است.

دلیل اصلی بروز این مشکل عدم توانایی نرم‌افزار در کنترل انباشت اطلاعات در تکرارهای مختلف است و در نهایت رشد نمایی داده‌ها دامن زده می‌شود. رشد نمایی داده‌ها اغلب در مدل‌های برنامه‌ریزی عدد صحیح مورد توجه می‌باشد؛ بدین ترتیب مدیریت شاخه‌های بسته نشده (unfathomed) نقش بسیار موثری در کاهش حافظه موقت ایفا خواهند کرد.

از طرفی زبان های سطح بالا مانند سی شارپ و جاوا به طور خودکار از قابلیت مدیریت حافظه پشتیبانی می‌کنند. به عبارتی اگر متغیر محلی برای ادامه‌ی برنامه مفید نباشد، مفسر بار مدیریت حافظه رو به دوش کشیده و با استفاده از خاصیت garbage collecting متغیرهای غیرضروری را جهت آزادسازی فضای حافظه‌ی موقت (RAM) حذف می‌نماید. در نرم افزار IBM Ilog CPLEX نیز روندی مشابه را شاهد هستیم. بخش profiler در این نرم‌افزار، مسئول نظارت بر مدیریت صحیح حافظه می‌باشد.

اغلب مواقع راه حل اصلی این است که بخشی از مدل یا داده‌های مدل سازمان‌دهی مجدد (restructure) شوند؛ به‌عبارتی جهت فشرده‌سازی داده‌ها و بهره‌برداری موثر از حافظه، توصیه می‌شود از ساختارهای داده (data structure) یا مجموعه های مرتب (tuple) بهره گرفته شود.