你的需求这样是解决不了的要分开处理。。比如,可将ip按第一位,写到255个文件里面,,,也可以将ip转换成数字,这样处理后续可以少用点内存分别在255个文件里面,找出前1000名因为每组至多包含2^24个不同的数【暂时不考虑ipv6】,这个内存可接受的
这样用一个数组遍历,复杂度O(n),即可找出前1000最后维护一个1000的有序数组,往里面插入数据即可,超过1000,弹出最小的那个
=====
能给出例子代码吗?
这样用一个数组遍历,复杂度O(n),即可找出前1000最后维护一个1000的有序数组,往里面插入数据即可,超过1000,弹出最小的那个
=====
能给出例子代码吗?
$line = fgets($fp);
$line = explode(' ',$line);
print_r($line);function read_100w($fp){
$i=0;
$ip_100w = array();
while(!feof($fp)){
$i++;
if($i > 1000000) break;
$line = fgets($fp);
$line = explode(' ',$line);
$ip_info = $line[6];
if(preg_match('/(\d\.\d\.\d\.\d):(\d)\[(\d\.\d\.\d\.\d):(\d)\]\->(\d\.\d\.\d\.\d):(\d)\[(\d\.\d\.\d\.\d):(\d)\]/i',$line[6],$ip_info)){
$alt_ip = $ip_info[5];
$alt_port = $ip_info[6];
@$ip_100w[$alt_ip]++;
}
}
arsort($ip_100w);}
?>
$filename = '/var/log/haproxy.log.3';
echo $filename . ': ' . filesize($filename) . ' bytes';?>
/var/log/haproxy.log.2: 12491488115 bytesPHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 1073741825 bytes) in /var/log/jincheng.php on line 7