PDA

View Full Version : برنامه فضای زیادی از رم میگیرد!



saed2006
سه شنبه 02 آذر 1389, 22:42 عصر
سلام
من یکسالی هست که روی برنامه ای کار میکنم الان که پروژه رو داریم تست میکنیم با یه مشکل مواجه شدیم و اون بزرگ شدن فضای مورد استفاده برنامه در رم هست و ازاد نشدن فضا هست
یک نقشه داخل برنامه ما میشه و یک سری کار روی نقشه انجام میشه و در نهایت یک لیستی از نقاط ساخته میشه ممکنه لیست بزرگ بشه یا کوچک
مشکل ما اینه که مثلا لیست یک عنصر که داره فضای اشغالی از رم 1 مگ هست حالا لیست 50 برار بزرگ میشه فضا 50 برابر میگیره باز لیست یکی میشه اینجا دیگه فضا بر نمیگرده
یعنی یه جورایی بعد از ده دقیقه کار کردن با برنامه اینقدر فضا از رم گرفته میشه که برنامه قفل میکنه چه روشی هست برای ازاد کردن ابجکت های مورد استفاده من حتی null هم ست میکنم بعد از استفاده از ابجکت و grab colect v رو هم صدا میزنم اما باز درست نمیشه یعنی باز یه مقداری از فضا ازاد نمیشه

hi level hdd
سه شنبه 02 آذر 1389, 22:52 عصر
سلام
اگه متغییر ها تونو null یا Dispose کردی بعدش از دستور Gc.Collect استفاده کن (توی C#)
البته توی C# مدیریت حافظه بصورت خودکار انجام میشه.ولی باز ضرری نداره استفاده کردنش

saed2006
سه شنبه 02 آذر 1389, 22:59 عصر
سلام
اگه متغییر ها تونو null یا Dispose کردی بعدش از دستور Gc.Collect استفاده کن (توی C#‎)
البته توی C#‎ مدیریت حافظه بصورت خودکار انجام میشه.ولی باز ضرری نداره استفاده کردنش
یعنی هر جایی که یک object ساختم بعدش null کنم
اخه من این کار رو هم میکنم اما باز فضا کامل ازاد نمیشه
اصلا به روش تضمینی وجود نداره که مشکل رو حل کنه؟
using چیه؟
در اینجا چیا کارم میاد؟

saed2006
چهارشنبه 03 آذر 1389, 09:42 صبح
اصلا ابزاری هست که بتونیم میزان مصرف ابجکت ها از حافظه رو بیرون بیاریم؟

ژوپیتر
چهارشنبه 03 آذر 1389, 10:02 صبح
فکر کنم ایراد کار جای دیگری است، مثال زیر رو یک نگاه بندازید:

Object1__Object2
|______Object3
|______Object4
|______Object5

ترتیب Dispose کردن رو باید رعایت کرد:

Object1__Object2.Dispose()
|______Object3.Dispose()
|______Object4.Dispose()
|______Object5.Dispose

بعدا:

Object1.Dispose

چون اگر رعایت نشه، حافظه اختصاص داده شده به صورت Leakage در حافظه می مونه، مثل فضا نوردی که در فضا رها شده و دیگه به ماهواره وصل نیست.

saed2006
چهارشنبه 03 آذر 1389, 12:05 عصر
سوال:
ایا این دستورات



retval=getretval1(retval);
retval=getretval2(retval);
: retval=getretval3(retval);
: retval=getretval4(retval);
: retval=getretval5(retval);
: returen retval;



فضای اضافی به سیستم تحمیل میکنه یا خیر؟
اگر میکنه چجوری جلوی مشکل رو بگیریم؟
مرسی

saed2006
چهارشنبه 03 آذر 1389, 13:00 عصر
این متد رو ببینید:



public List<List<st.SobhanPoint>> Move(List<List<st.SobhanPoint>> list, float x, float y, float z)
{
return
list.Select(
sobhanPoints =>
sobhanPoints.Select(
sobhanPoint =>
new st.SobhanPoint(new st.Pooint(sobhanPoint.point.X + x, sobhanPoint.point.Y + y, 0, 0, ""),
sobhanPoint.ToolNumber, sobhanPoint.color, sobhanPoint.mapName,
sobhanPoint.RemoveMode, sobhanPoint.Show)).ToList()).ToList();
}



retval=Move(retval,2,2,2);
متد move فضای زیادی رو میگیره و هدر میده
یعنی مقادیر داخل لیست ورودی تغییر میکنه و ابعاد ماتریس اصلا بزرگ نمیشه اما متد mov 20mg
فضای اضافی میگیره

FastCode
چهارشنبه 03 آذر 1389, 16:54 عصر
این متد رو ببینید:



public List<List<st.SobhanPoint>> Move(List<List<st.SobhanPoint>> list, float x, float y, float z)
{
return
list.Select(
sobhanPoints =>
sobhanPoints.Select(
sobhanPoint =>
new st.SobhanPoint(new st.Pooint(sobhanPoint.point.X + x, sobhanPoint.point.Y + y, 0, 0, ""),
sobhanPoint.ToolNumber, sobhanPoint.color, sobhanPoint.mapName,
sobhanPoint.RemoveMode, sobhanPoint.Show)).ToList()).ToList();
}



retval=Move(retval,2,2,2);
متد move فضای زیادی رو میگیره و هدر میده
یعنی مقادیر داخل لیست ورودی تغییر میکنه و ابعاد ماتریس اصلا بزرگ نمیشه اما متد mov 20mg
فضای اضافی میگیره

برنامه شما دقیقاً کارش چیه؟
ماتریس؟
پردازش تصویر؟
رندر؟
AI؟
از کد شما هیچ چیزی معلوم نیست.
ولی جمله ای که میتونم بگم اینه که
postmature optimization به اندازه premature optimization خطرناکه.بهتره که موقعی که یه متد رو مینویسید تعداد بایتهایی رو که استفاده میکنه حساب کنید.

در ضمن مشکلی که من توی کد شما احساس میکنم.(بوش به مشام میرسه) cyrcular dependency ه.
راجع بهش تحقیق کنید.
از IDisposable استفاده کنید و توی متود Dispose تمام reference ها رو Dispose و set null بکنید.

ژوپیتر
چهارشنبه 03 آذر 1389, 19:41 عصر
سوال:
ایا این دستورات



retval=getretval1(retval);
retval=getretval2(retval);
: retval=getretval3(retval);
: retval=getretval4(retval);
: retval=getretval5(retval);
: returen retval;


فضای اضافی به سیستم تحمیل میکنه یا خیر؟
اگر میکنه چجوری جلوی مشکل رو بگیریم؟
مرسی


آره، دقیقا همینه، وقتی retval رو به یک تابع پاس دادید و نتیجه رو دو باره تو retval گذاشتید، فکر می کنید چه بلایی سر مقدار قبلی retval میاد؟ جواب: تو حافظه موندگاره.

شاید با یک مثال بهتر متوجه بشید:

font retval = new font()
retval = new font()
الان من دوبار retval رو new کردم ولی با Dispose کردن retval فقط دومین font از حافظه پاک میشه و اولی هنوز حافظه رو اشغال کرده، اگه این کار رو تکرار و تکرار بکنید، فاجعه است و در نهایت حافظه ای پر از اطلاعات غیر قابل دسترس و بیخود دارید.

saed2006
پنج شنبه 04 آذر 1389, 00:29 صبح
آره، دقیقا همینه، وقتی retval رو به یک تابع پاس دادید و نتیجه رو دو باره تو retval گذاشتید، فکر می کنید چه بلایی سر مقدار قبلی retval میاد؟ جواب: تو حافظه موندگاره.

شاید با یک مثال بهتر متوجه بشید:

font retval = new font()
retval = new font()
الان من دوبار retval رو new کردم ولی با Dispose کردن retval فقط دومین font از حافظه پاک میشه و اولی هنوز حافظه رو اشغال کرده، اگه این کار رو تکرار و تکرار بکنید، فاجعه است و در نهایت حافظه ای پر از اطلاعات غیر قابل دسترس و بیخود دارید.



من این دستور رو
for i=0 to 10000000000000
retval=get(retval)

نوشتم اما هیچ فضایی گرفته نشد
بعید میدونم این حرف شما سندیت علمی داشته باشه
استاد موسوی میشه کمی در مورد مسائل مطرح شده در تاپیک توضیح بدین

ehsan3554
پنج شنبه 04 آذر 1389, 01:36 صبح
ببخشید من زیاد برنامه نویسی ام قوی نیست ولی تا اونجا که من می دونم برای استفاده از اشیای سنگین یا اشیایی که زمانی قراره سنگین بشن از using و یک بلاک استفاده می کنیم تا مطمئن بشیم در پایان بلاک نابود میشن مثل
(()using (img = new image
}
{

saed2006
پنج شنبه 04 آذر 1389, 09:49 صبح
ببخشید من زیاد برنامه نویسی ام قوی نیست ولی تا اونجا که من می دونم برای استفاده از اشیای سنگین یا اشیایی که زمانی قراره سنگین بشن از using و یک بلاک استفاده می کنیم تا مطمئن بشیم در پایان بلاک نابود میشن مثل
(()using (img = new image
}
{
خب پشت متد using چیزی نباید بنویسیم؟
من تا حالا باهاش کار نکردم
میشه توضیح بدین

Salar Ashgi
پنج شنبه 04 آذر 1389, 13:58 عصر
Improving .NET Application Performance and Scalability

لینک مورد نظر (http://msdn.microsoft.com/en-us/library/ff649152.aspx)

این مقاله آموزشی از خود سایت مایکروسافت میباشد و میتونه کمک شایانی در این زمینه براتون داشته
باشه .

موفق باشید ./

ژوپیتر
پنج شنبه 04 آذر 1389, 14:35 عصر
من این دستور رو
for i=0 to 10000000000000
retval=get(retval)

نوشتم اما هیچ فضایی گرفته نشد
بعید میدونم این حرف شما سندیت علمی داشته باشه
استاد موسوی میشه کمی در مورد مسائل مطرح شده در تاپیک توضیح بدین

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