【云顶娱乐棋牌游戏】日志深入分析,Shell大文件数量计算而且排序

那么横向设计,一次插入一条数据。

同样对于如此大的文件,单纯用PHP做是肯定行不通的,我的思路是不管多大文件,首先要切割为多个应用可以承受的小文件,然后批量或者依次分析统计小文件后再把总的结果汇总后统计出符合要求的最终结果。类似于比较流行的MapReduce模型,其核心思想就是“Map(映射)”和“Reduce(化简)”,加上分布式的文件处理,当然我能理解和使用到的只有Reduce后去处理。

mongo中有这个内嵌文档,非常爽。推荐使用hadoop

 代码如下

……

awk -F '@' '{name[$1]++ } END {for (count in name) print
name[count],count}' qq.txt |sort -n > 123.txt

2、在生成日志的文件名称的时候也要依照一定规则,在分析的时候,正則表達式好匹配,如
serverhostname_date.log  这样在匹配的时候 仅仅须要 glob(*—date.log);
//glob 见php函数手冊,寻找与模式匹配的文件路径。

qq.txt被分割为名字是qqfileaaa到qqfilebml的1000个文件,每个文件11mb大小,这时再使用任何处理方法都会比较简单了。我还是使用PHP进行分析统计:

统计完插入。。

split -l 1000000 -a 3 qq.txt qqfile

        ………………

诸多大互联网公司的面试都会有这么个问题,有个4G的文件,如何用只有1G内存的机器去计算文件中出现次数做多的数字(假设1行是1个数组,例如QQ号码)。如果这个文件只有4B或者几十兆,那么最简单的办法就是直接读取这个文件后进行分析统计。但是这个是4G的文件,当然也可能是几十G甚至几百G的文件,这就不是直接读取能解决了的。

程序最好不要写得非常死板,

 

存储结构例如以下

 代码如下

                      }

互联网几何级增长,未来不管是大文件处理还是可能存在的大数据都存在很大的需求空间

        $aCountResult[$iGameId] = (int)$aCountResult[$iGameId] +
$iNum;

 代码如下

          1   1001    3000  2013-03-23  12:22:21

生成文件的世界比较长,Linux下直接使用php-client运行PHP文件会比较节省时间,当然也可以使用其他方式生成文件。生成的文件大约11G。

        $aCountResult[$iGameId] = $iNum;

$results = array();
foreach( glob('/tmp/qq/*') as
$file ){
    $fp = fopen($file,'r');
    $arr = array();
    while( $qq = fgets($fp) ){
        $qq = trim($qq);
        isset($arr[$qq]) ? $arr[$qq]++ : $arr[$qq]=1;
    }
    arsort($arr);
    //以下处理方式存在问题
    do{
        $i=0;
        foreach( $arr as $qq=>$times ){
            if( $i > 10 ){
                isset($results[$qq]) ? $results[$qq]+=$times :
$results[$qq]=$times;
                $i++;
            } else {
                break;
            }
        }
    } while(false);
    fclose($fp);
}
if( $results ){
    arsort($results);
    do{
        $i=0;
        foreach( $results as $qq=>$times ){
            if( $i > 10 ){
                echo $qq . "t" . $times . "n";
                $i++;
            } else {
                break;
            }
        }
    } while(false);
}

$iNum = 100;

 代码如下

if(isset($aCountResult[$iGameId]))

这样每个样本取前10个,最后放到一起分析统计,不排除有个数在每个样本中都排名第11位但是总数绝对在前10的可能性,所以后面统计计算算法还需要改进。

……

然后使用Linux Split切割文件,切割标准为每100万行数据1个文件。

else

假设有1个10亿行的文件,每行一个6位-10位不等的QQ号码,那么我需要解决的就是计算在这10亿个QQ号码中,重复最多的前10个号码,使用下面的PHP脚本生成这个文件,很可能这个随机数中不会出现重复,但是我们假设这里面会有重复的数字出现。

结构: id gameid count createtime

也许有人说使用Linux中的awk和sort命令可以完成排序,但是我试了下如果是小文件还可以实现,但是11G的文件,不管是内存还是时间都无法承受。下面是我改的1个awk+sort的脚本,或许是写法有问题,求牛人指导。

然后添�计划程序中,ok。。

$fp = fopen('qq.txt','w+');
for( $i=0; $i<1000000000; $i++ ){
    $str = mt_rand(10000,9999999999)."n";
    fwrite($fp,$str);
}
fclose($fp);

$aLogfileName = glop($sLogfileName); //
匹配要处理的日志文件,读入数组中。

4、为什么要用rsync?将多台server的日志同步到一个文件夹下,一起处理,比較方便。

3、为什么要用nosql?事实上project师不是只局限于知道怎么实现,而是要多思考什么样的业务用什么样的工具来解决。非关系型数据非常适合这样的,日志中经常添�新的行为,你用key-value的方式,不须要日志新增了要分析的行为,你就得手动改变你程序的配置,这样我个人认为不是太好。~假如用mysql,你纵向设计数据库,

$aCountResult = array();

 这种坏处是 每次新增了游戏ID
那么就得改变数据表结构,加字段,当然你牛逼点的能够所实用程序来实现,可是这样我认为不太好。

……

1、说明一点在日志写入的时候必须依照一种严格的格式,这样在做解析的时候,才好分割。比方
gameid:123  gameid:2333。分割统一标准即可。

是不是经常要分析用户的行为?是不是经常遇到多台server上传的日志一起分析?是不是对数据统计的间隔时间要求非常短?还有木有由于日志文件过大,而须要分块处理?

一次仅仅插入一条数据,新增游戏类型不须要做不论什么改变,perfect~

相关文章

Comment ()
评论是一种美德,说点什么吧,否则我会恨你的。。。