ورود

View Full Version : سوال: میزان حافظه اختصاصی به Stack چقدر است و چگونه میتوان آنرا افزایش داد؟



vasilopita
چهارشنبه 24 اسفند 1390, 13:19 عصر
سلام دوستان. من یه برنامه بصورت بازگشتی نوشتم. اولش واقعا فک نمیکردم برنامه این قدر ها نیاز به حافظه داشته باشه. ولی حالا مشکل سرریز پشته رو پیدا کردم. برنامه به این طریق هستش که بین فولدر ها جستجو می کنه. سوالم اینه که :
اولا: حافظه ای که به پشته تعلق می گیره چقدر هست ؟
دوما: میشه این حافظه رو کاری کرد زیاد تر شه ؟ یعنی احیانا این جز تنظیمات ویژال استادیو نیست ؟

ممنون می شم راهنمایی بفرمایید

mehdi.mousavi
چهارشنبه 24 اسفند 1390, 13:33 عصر
سلام.
در حالت عادی، این میزان بصورت پیش فرض 1MB هستش و میشه اونو با /F Switch (http://msdn.microsoft.com/en-us/library/tdkhxaks%28v=vs.100%29.aspx) تغییر داد.
طبیعتا اگر براتون امکان داره، منطق برنامه رو بگونه ای تغییر بدید که از الگوریتم های Recursive استفاده نکنه،
اما اگر چنین چیزی میسر نیست، میتونید با /F میزان حافظه پیش فرض رو تغییر بدید.

موفق باشید.

vasilopita
چهارشنبه 24 اسفند 1390, 14:33 عصر
راهی وجود داره که بفهمم کلا برنامه به چه میزان حافظه نیاز داره ؟ چون نمی خوام الکی با این دستور که فرمودید بهش حافظه بدم و حافظه بیخود مصرف شه

من خواستم همین کاری که فرمودید رو انجام بدم ولی کامپایلر این و به عنوان یک کلمه ی کلیدی نمی شناسه. تو msdn نوشته بود که انگار باید برم تو قسمت Command Line و این دستور رو اونجا اضافه کنم. ولی واقعا نمی دونم باید چی کار کنم؟

mehdi.mousavi
چهارشنبه 24 اسفند 1390, 16:11 عصر
راهی وجود داره که بفهمم کلا برنامه به چه میزان حافظه نیاز داره ؟ چون نمی خوام الکی با این دستور که فرمودید بهش حافظه بدم و حافظه بیخود مصرف شه
من خواستم همین کاری که فرمودید رو انجام بدم ولی کامپایلر این و به عنوان یک کلمه ی کلیدی نمی شناسه. تو msdn نوشته بود که انگار باید برم تو قسمت Command Line و این دستور رو اونجا اضافه کنم. ولی واقعا نمی دونم باید چی کار کنم؟

سلام.
می تونید در تابعی که بصورت Recursive فراخوانی میشه، با استفاده از روشی که در این پست (http://stackoverflow.com/questions/1740888/determining-stack-space-with-visual-studio) گفته شده مقدار مورد نیاز Stack رو بدست بیارید (منظورم تابع getTib هستش، و نه VirtualQuery، یعنی پاسخ دوم در آدرسی که دادم). سوئیچ f نیز فقط وقتی کار میکنه که برنامه در یک Step هم Compile بشه و هم Link (که بندرت پیش میاد). بنابراین، میتونید از سوئیچ /stack در linker برای اینکار استفاده کنید. برای زدن این سوئیچ در VS2010، هم میتونید دستی به Command Line (در قسمت Linker) این سوئیچ رو اضافه کنید و هم میتونید در همون بخش Linker، Stack Reserve Size رو روی میزان مورد نظر بذارید. البته روش دیگه استفاده از editbin utility هستش که همراه Visual Studio نصب میشه. اونجا هم میتونید روی exe ی فایل، stack size رو بزنید تا فایل exe تغییر کنه...

موفق باشید.

barnamenevisforme
چهارشنبه 24 اسفند 1390, 16:22 عصر
سلام
البته ببخشید در بین اساتید اظهر نظر میکنم.
یکی از دلایل به وجود اومدن خطای out of stack space استفاده از آرایه هاییه که در بعضی از خونه های اون اطلاعات پر نشده.
روشی که به نظر میاد این نقیصه رو با اون میشه حل کرد اینه که طول آرایه به میزانی که نیاز هست تعریف بشه و در صورت نیاز به خونه های بیشتر ،در حین کار به طول آرایه اضافه و مقادیر قبلی به اون اختصاص داده بشه.

vasilopita
پنج شنبه 25 اسفند 1390, 19:44 عصر
دوباره سلام. خیلی سعی کردم دوباره اینجا پست نذارم ولی ...
اون کاری که فرمودید رو انجام دادم یعنی از استفاده از STACK/ ، اما باش مشکل دارم. نمی دونم چجوری باید این اعداد رو جایگزینش کنم. چیزی که متوجه شدم اینه که Commit در واقع مقدار اولیه ای هست که به پشته داده می شه و reserve مقداری هست که در صورت نیاز پشته می تونه به اون افزایش پیدا کنه. من هم طبق ان چیزی که فرموده بودید عمل کردم. به این طریق: /STACK:2097152[,4096] که در واقع Reserve رو به 2 مگا بایت (2097152 بایت) و commit رو به 4 کیلو بایت (4096 بایت) تغییر دادم. اما موقع کامپایل می گه اعداد اشتباها.
یک راهه دیگه رو امتحان کردم، از قسمت Project>properties>linker>system ، مقدار stack reserve size رو به 2 مگابایت (2097152 بایت) تغییر دادم. این بار برنامه بدون هیچ مشکلی کامپایل شد ولی باز دقیقا همون جای قبلی پشته دچار سرریز شد.
لطفا راهنماییم کنید.ممنون