一.內(nèi)存溢出解決方案
在做數(shù)據(jù)統(tǒng)計(jì)分析時(shí),經(jīng)常會(huì)遇到大數(shù)組,可能會(huì)發(fā)生內(nèi)存溢出,這里分享一下我的解決方案。還是用例子來(lái)說(shuō)明這個(gè)問(wèn)題,如下:
假定日志中存放的記錄數(shù)為500000條,那么解決方案如下:
復(fù)制代碼 代碼如下:
ini_set(‘memory_limit','64M'); //重置php可以使用的內(nèi)存大小為64M,一般在遠(yuǎn)程主機(jī)上是不能修改php.ini文件的,只能通過(guò)程序設(shè)置。注:在safe_mode(安全模式)下,ini_set失效
set_time_limit(600);//設(shè)置超時(shí)限制為6分鐘
$farr = $Uarr = $Marr = $IParr = $data = $_sub = array();
$spt = ”$@#!$”;
$root = ”/Data/webapps/VisitLog”;
$path = $dpath = $fpath = NULL;
$path = $root.”/”.date(“Y-m”,$timestamp);
$dpath = $path.”/”.date(“m-d”,$timestamp);
for($j=0;$j<24;$j++){
$v = ($j < 10) ? ”0″.$j : $j;
$gpath = $dpath.”/”.$v.”.php”;
if(!file_exists($gpath)){
continue;
} else {
$arr = file($gpath);////將文件讀入數(shù)組中
array_shift($arr);//移出第一個(gè)單元-》<?php exit;?>
$farr = array_merge($farr,$arr);
unset($arr);
}
}
if(empty($this->farr)){
echo ”<p><center>沒(méi)有相關(guān)記錄!</center></p>”;
exit;
}
while(!empty($farr)){
$_sub = array_splice($farr, 0, 10000); //每次取出$farr中1000個(gè)
for($i=0,$scount=count($_sub);$i<$scount;$i++){
$arr = explode($spt,$_sub[$i]);
$Uarr[] = $arr[1]; //vurl
$Marr[] = $arr[2]; //vmark
$IParr[] = $arr[3].” |$nbsp;”.$arr[1]; //IP
}
unset($_sub);//用完及時(shí)銷(xiāo)毀
}
unset($farr);
二.unset銷(xiāo)毀變量并釋放內(nèi)存問(wèn)題
PHP的unset()函數(shù)用來(lái)清除、銷(xiāo)毀變量,不用的變量,我們可以用unset()將它銷(xiāo)毀。但是某些時(shí)候,用unset()卻無(wú)法達(dá)到銷(xiāo)毀變 量占用的內(nèi)存!我們先看一個(gè)例子:
復(fù)制代碼 代碼如下:
<?php
$s=str_repeat('1',255); //產(chǎn)生由255個(gè)1組成的字符串
$m=memory_get_usage(); //獲取當(dāng)前占用內(nèi)存
unset($s);
$mm=memory_get_usage(); //unset()后再查看當(dāng)前占用內(nèi)存
echo $m-$mm;
?>
復(fù)制代碼 代碼如下:
<?php
$s=str_repeat('1',256); //產(chǎn)生由256個(gè)1組成的字符串
$m=memory_get_usage(); //獲取當(dāng)前占用內(nèi)存
unset($s);
$mm=memory_get_usage(); //unset()后再查看當(dāng)前占用內(nèi)存
echo $m-$mm;
?>
復(fù)制代碼 代碼如下:
<?php
$s=str_repeat('1',256); //這和第二個(gè)例子完全相同
$p=&$s;
$m=memory_get_usage();
unset($s); //銷(xiāo)毀$s
$mm=memory_get_usage();
echo $p.'<br />';
echo $m-$mm;
?>
復(fù)制代碼 代碼如下:
<?php
$s=str_repeat('1',256); //這和第二個(gè)例子完全相同
$p=&$s;
$m=memory_get_usage();
$s=null; //設(shè)置$s為null
$mm=memory_get_usage();
echo $p.'<br />';
echo $m-$mm;
?>
復(fù)制代碼 代碼如下:
<?php
$s=str_repeat('1',256); //這和第二個(gè)例子完全相同
$p=&$s;
$m=memory_get_usage();
unset($s); //銷(xiāo)毀$s
unset($p);
$mm=memory_get_usage();
echo $p.'<br />';
echo $m-$mm;
?>
新聞熱點(diǎn)
疑難解答