日期:2014-05-17  浏览次数:20492 次

取一个数组的前1000条数值
<?php

$fn = '/var/log/haproxy.log.2';
$fp = fopen($fn, 'r') or die("file open $fn false");
while($s = fgets($fp)) {
  preg_match('/\[[\d.:]+\].+\[([\d.:]+)\]/', $s, $r);
  if(empty($r[1])) continue;
  @$res[$r[1]]++;
}



fclose($fp);
asort($res);
 
print_r($res);
?>

------解决方案--------------------
你的需求这样是解决不了的

要分开处理。。。。。

比如,可将ip按第一位,写到255个文件里面,,,也可以将ip转换成数字,这样处理后续可以少用点内存

分别在255个文件里面,找出前1000名。。。因为每组至多包含2^24个不同的数【暂时不考虑ipv6】,这个内存可接受的
这样用一个数组遍历,复杂度O(n),即可找出前1000

最后维护一个1000的有序数组,往里面插入数据即可,超过1000,弹出最小的那个