خالی کردن حافظه رم؟!؟

my friend

Member
سلام

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

خیلی در این مورد جستجو کردم... اما چیزی گیرم نیومد...
 

jhoseini

Member
خوب، شما اگه از یه تعداد متغیر محدود استفاده کنید، فکر نمیکنم رم زیاد مصرف بشه
البته من زیاد از مصرف حافظه و .. توی کامپایلر php نمیدونم (یعنی خیلی دوست دارم بدونم، اما... )
 

hba

Active Member
حلقه بینهاد رو رم نیست رو cpu تاثیر می گذاره که جلوش رو نمیشه گرفت
چون کامپایلر نمیتونه وایسه
 

alireza82

Well-Known Member
سلام
با پایان اجرای اسکریپت حافظه خالی میشه و متغییر ها از بین میرن! پس با اجرای مجدد یعنی اسکریپت شما کارش تموم شده بوده قبلا که در اون صورت متغییر ها هم از رم پاک شدن!!! شما اون چند تا متغییری که میخوای رو میتونی با سشن یا کوکی یا ارسال به صورت گت نگهداری!!!
حلقه بینهایت بار پردازشی رو cpu میاره اما طبق شرایطی میتونه رو رم هم تاپیر بزاره در صورتی که متغییری تولید شه ، مثلا اگر یه ارایه داشته باشم و هی اندیس حلقه رو بریزم توش اونوقت خوب رو رم هم تاثیر میزاره!!!
برای از بین بردن متغییر ها هم توابعی وجود دارن ، مثل unset .
موفق باشید
 

peyman1987

Member
سلام

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

خیلی در این مورد جستجو کردم... اما چیزی گیرم نیومد...

جناب my_friend عزيز من درست متوجه نشدم. اگه منظور شما از حلقه بينهايت يه چيزي مثل اينه :

PHP:
$x = 51;
while($x <10)
{
دستورات
}

بايد بگم احساس ميکنم اصلا توي وب معني نداره. چون تا اجراي اسکريپت تموم نشه صفحه به سمت کاربر ارسال نميشه و تا زماني هم که تمام دستورات موجود در فايل اجرا نشدن کار تفسير و کامپايل اسکريپت تموم نميشه. اينجوري تکليف کاربر چيه؟؟؟
 
آخرین ویرایش:

my friend

Member
فکر کنم اگه اون متغیر هایی که نیاز نداری رو مساوی null قرار بدی مشکلت حل بشه
باید تستش کنم...
حلقه بینهاد رو رم نیست رو cpu تاثیر می گذاره که جلوش رو نمیشه گرفت
چون کامپایلر نمیتونه وایسه
و این یعنی اینکه رم پر نمیشه؟
نمیشه یه جوری سرعت رو کم کرد تا روی cpu تاثیر کمتری بزاره؟
سلام
با پایان اجرای اسکریپت حافظه خالی میشه و متغییر ها از بین میرن! پس با اجرای مجدد یعنی اسکریپت شما کارش تموم شده بوده قبلا که در اون صورت متغییر ها هم از رم پاک شدن!!! شما اون چند تا متغییری که میخوای رو میتونی با سشن یا کوکی یا ارسال به صورت گت نگهداری!!!
حلقه بینهایت بار پردازشی رو cpu میاره اما طبق شرایطی میتونه رو رم هم تاپیر بزاره در صورتی که متغییری تولید شه ، مثلا اگر یه ارایه داشته باشم و هی اندیس حلقه رو بریزم توش اونوقت خوب رو رم هم تاثیر میزاره!!!
برای از بین بردن متغییر ها هم توابعی وجود دارن ، مثل unset .
موفق باشید
من فقط چند تا متغیر رو هر دفعه از MySQL میخونم ، پردازش میکنم و نتایج رو دوباره تو MySQL میریزم...
با تابع unset از قبل آشنایی دارم... اگه متغیری رو به صورت آرگومان بهش بدیم ، بعد از این که متغیر رو از بین میبره ، از رم هم پاک میکنه؟
جناب my_friend عزيز من درست متوجه نشدم. اگه منظور شما......
کاربر قرار نیست به این فایل دسترسی داشته باشه... نمیدونم چی مثال بزنم... آهان ، فهمیدم:
مثلا یه موتور جستجوگر داریم ، این فایل کار جستجو بین سایت ها و ایندکس کردن صفحات رو انجام میده... فایلی که تا بینهایت لینک ها رو دنبال میکنه(و هیچوقت این حلقه تموم نمیشه)... اگه دو دفعه همزمان اجرا بشه ، همه چیز رو بهم میریزه... (باید دسترسی کاربر به فایل گرفته بشه)


دو تا از دوستان در مورد بغییر مقدار متغیر با null ، بروز کردن متغیر بجای از بین بردن و دوباره خواندن اون ، یا استفاده از تابع ()unset پیشنهاد داده بودند... میخواستم بپرسم که کدوم میتونن کمترین میزان اشغال حافظه رو بگیرن؟
من در مورد میزان استفاده سخت افزاری php چیز زیادی نمیدونم...

راستی ، چطوری میتونیم از منابع سخت افزاری و میزان مصرف شده اونها اطلاع پیدا کنیم؟
مثلا از میزان حافظه رم ، میزان مصرف شده ، میزان فضای دیسک ، میزان مصرف فضای دیسک و غیره اطلاعات پیدا کنیم؟
 
آخرین ویرایش:

alireza82

Well-Known Member
باید تستش کنم...
تستش نکنید!!ما یه 0 داریم یه 1 و یه null !!! (صفر و یک به معنای مقدار حالا میتونه دنباله ای از اینا باشه! از دید باینری!!!) وقتی شما مقدار یه متغییر رو برابر نال میزاری این متغییر در اصل وجود داره حالا مقدارش برابر با هیچی هست! نال یعنی هیچی نه 0 و نه 1 ، هیچی خلاء یا هر چیزی که اسمش رو بزارید! پس وقتی متغییر وجود داره حافظه ای هم ولو کمتر بهش اختصاص پیدا میکنه!!

و این یعنی اینکه رم پر نمیشه؟
نمیشه یه جوری سرعت رو کم کرد تا روی cpu تاثیر کمتری بزاره؟

چرا پست ها رو کامل بخونید!
بسته به ساختار حلقه تون داره !!! ممکنه رم هم بخوره!
با تابع sleep میشه زمانی رو برای خواب هر بار اجرای حلقه در نظر گرفت که مناسب هست!!1

من فقط چند تا متغیر رو هر دفعه از MySQL میخونم ، پردازش میکنم و نتایج رو دوباره تو MySQL میریزم...
با تابع unset از قبل آشنایی دارم... اگه متغیری رو به صورت آرگومان بهش بدیم ، بعد از این که متغیر رو از بین میبره ، از رم هم پاک میکنه؟
بله ، تابع unset با متغییر کاری میکنه که انگار اون متغییر وجود نداشته! حافظه شو میگیره و ازاد میکنه
کاربر قرار نیست به این فایل دسترسی داشته باشه... نمیدونم چی مثال بزنم... آهان ، فهمیدم:
مثلا یه موتور جستجوگر داریم ، این فایل کار جستجو بین سایت ها و ایندکس کردن صفحات رو انجام میده... فایلی که تا بینهایت لینک ها رو دنبال میکنه(و هیچوقت این حلقه تموم نمیشه)... اگه دو دفعه همزمان اجرا بشه ، همه چیز رو بهم میریزه... (باید دسترسی کاربر به فایل گرفته بشه)
این و نمیدونم سوال بود یا به اون دوستمون توضیح داده بودید!!!!!!!!!!
دو تا از دوستان در مورد بغییر مقدار متغیر با null ، بروز کردن متغیر بجای از بین بردن و دوباره خواندن اون ، یا استفاده از تابع ()unset پیشنهاد داده بودند... میخواستم بپرسم که کدوم میتونن کمترین میزان اشغال حافظه رو بگیرن؟
من در مورد میزان استفاده سخت افزاری php چیز زیادی نمیدونم...

بازم unset
راستی ، چطوری میتونیم از منابع سخت افزاری و میزان مصرف شده اونها اطلاع پیدا کنیم؟
مثلا از میزان حافظه رم ، میزان مصرف شده ، میزان فضای دیسک ، میزان مصرف فضای دیسک و غیره اطلاعات پیدا کنیم؟

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

my friend

Member
از همه ، خصوصا جناب علیرضا و جناب محسنی متشکرم.

یه آزمایش کوچولو انجام دادم ، نتایجش رو اینجا میزارم تا اگه یه زمانی کس دیگه ای هم سوال من رو داشت و سرچ کرد ، زودتر به نتیجه برسه...

با استفاده از کد زیر یه فایل 15 مگابایتی رو تست کردم ، میزان حافظه مصرفی به حدود 300 مگابایت رسید...
بعد یکبار با استفاده از تابع unset و یک بار هم با قراردادن مقدار متغیر مورد نظر برابر با NULL سعی کردم ببینم کدوم کار بهتری انجام میدن ، باید بگم که........ نتایج یکسان بود!
PHP:
for($i; $i<20; $i++)
	$test[] = file_get_contents('test.exe');
sleep(5);
unset($test);# or $test=NULL;
sleep(5);

برای پیدا کردن میزان مصرف ram ، از task manager ویندوز استفاده کردم که با دقت 1 کیلوبایت اندازه گیری میکنه...
در ضمن ، باید بگم که تابع ()sleep باعث میشد که cpu برای مدتی از حالت کارکردن خارج بشه که مقصودم رو برآوره کرد...(همونطور که علیرضا گفته بود)

(راستش رو بخواهید فکر نمیکردم که یه زمانی اولین چیزهایی که از زبان PHP یاد گرفتم رو سوال کنم!!!)

باز هم از همگی ممنونم.
 
آخرین ویرایش:

alireza82

Well-Known Member
از همه ، خصوصا جناب علیرضا و جناب محسنی متشکرم.

یه آزمایش کوچولو انجام دادم ، نتایجش رو اینجا میزارم تا اگه یه زمانی کس دیگه ای هم سوال من رو داشت و سرچ کرد ، زودتر به نتیجه برسه...

با استفاده از کد زیر یه فایل 15 مگابایتی رو تست کردم ، میزان حافظه مصرفی به حدود 300 مگابایت رسید...
بعد یکبار با استفاده از تابع unset و یک بار هم با قراردادن مقدار متغیر مورد نظر برابر با NULL سعی کردم ببینم کدوم کار بهتری انجام میدن ، باید بگم که........ نتایج یکسان بود!
PHP:
for($i; $i<20; $i++)
	$test[] = file_get_contents('test.exe');
sleep(5);
unset($test);# or $test=NULL;
sleep(5);

برای پیدا کردن میزان مصرف ram ، از task manager ویندوز استفاده کردم که با دقت 1 کیلوبایت اندازه گیری میکنه...
در ضمن ، باید بگم که تابع ()sleep باعث میشد که cpu برای مدتی از حالت کارکردن خارج بشه که مقصودم رو برآوره کرد...(همونطور که علیرضا گفته بود)

(راستش رو بخواهید فکر نمیکردم که یه زمانی اولین چیزهایی که از زبان PHP یاد گرفتم رو سوال کنم!!!)

باز هم از همگی ممنونم.
خواهش دوست من!!!
راستی یه سوال نتیایج ازمایشی که انجام دادی برای منم جالب بود!! و باید بگم باور نکردنی حداقل با اون دیدی که من داشتم!!
تسک منیجر ویندوز رو وقتی برای اینکار استفاده میکردی میزان حافظه مصرفی رو با استفاده از چی دیدی!! از tab مربوط به processes و یا performance !!!!
آخه یه نکته ای که هست مربوط به حافظه مجازی هست!! آیا میزان اون رو هم تو هر ازمایش چک کردید ببینید تو هر کدوم چقدر حافظه مجازی مصرف میشه!!!
تا ببینیم نتایج ازمایش چقدر قابل اعتماد بوده!!! هر چند ممنون از این کاری که کردی جالب بود!!
موفق باشی
 

alireza82

Well-Known Member
اوووووو پسر !!! اوووو پسر حالا فهمیدم چیکار کردی!!!
ببین به نظرم این کد درستی برای فهمیدن این نکته نیست بزار یکم فکر کنم منم یه کد دیگه بزارم تا اگر شد به یه نتیجه ای برسیم!!1
بزار یکم فکر کنم میخوام سعی کنم اگر شد یه مثال نقض بیارم.:eek:
اگرم نشد که هیچی:D
 

alireza82

Well-Known Member
دوست من سلام:wink:!
آقا این ازمایش شما من و راضی نکرد و چون همونطور که گفتم با پیشفرضیات من نمیخوند تصمیم گرفتم منم یه آزمایشکی بکنم!!
اما همونطور که میدونی تسک منیجر منبع خوبی نبود مخصوصا اینکه شما در حد بایت باید دقت میداشتی نه کیلوبایت!! برا همین من یه سری به بزرگترم زدم و از اون سوال پرسیدم تابع قشنگی اونجا پیدا کردم و یه تیکه کد خوشگل و قشگ که الان میزارم!!
فایل اول:
PHP:
<?php
echo memory_get_usage() . "\n"; 
$a = str_repeat("Hello", 4242);
echo memory_get_usage() . "\n"; 
unset($a);
echo memory_get_usage() . "\n"; 
?>
فایل دوم:
PHP:
<?php
echo memory_get_usage() . "\n"; 
$a = str_repeat("Hello", 4242);
echo memory_get_usage() . "\n"; 
$a=NULL;//or a='';
echo memory_get_usage() . "\n"; 
?>
خوب اگر این دوتا کد رو اجرا و حتی کمی دست کاری کنی میبینید که به ازای هر متغییر نال شده ما 4 بایت بیشتر داریم نسبت به زمانی که از unset استفاده میکنیم.
یعنی در پایان اجرا اونی که از unset توش استفاده شده بود 39108 بایت و اونی که نال رو استفاده کرده بودیم 39112 بایت حافظه مصرف کرده بودند. این مقدار منظورم بعد از آنست و یا نال شدن و قبل از تگ پایانی php بدست اومد که اسکریپت تمام کاراش رو کرده بود.
نکته: این مقادیر تو کامپیوتر من بدست اومده و طبق توضیحات بزرگترم یعنی php.net بزرگ ممکنه تو کامپیوتر شما نتایج از نظر مقدار متفاوت باشه!!
موفق باشید
دیگه از این دقیق تر نمیشه:shock:
موفق باشید.:wink:
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا