PHP/Shell大文件数据统计并且排序

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

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

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

 代码如下 复制代码

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

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

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

 

 代码如下 复制代码
split -l 1000000 -a 3 qq.txt qqfile

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

 代码如下 复制代码

$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);
}

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

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

 代码如下 复制代码

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

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

时间: 2024-09-28 13:12:51

PHP/Shell大文件数据统计并且排序的相关文章

通过shell脚本生成数据统计信息的报表

对于统计信息的收集,不同的环境中使用的策略也会有很大的不同,有的按照一定的时间频率来收集,有的比较稳定的系统根据数据的增长频率来收集,用户比较稳定的系统,甚至都不再收集统计信息. 以下是使用shell生成的统计信息报表效果,可以在备份库中进行这些信息的收集,可以看到哪些表的查询耗费的时间较多,当前数据条数和统计信息中的数据条数. #############################################################################     ta

Sybase IQ如何将大文件数据迅速加载到数据库

试想一下,如果一个文件5G.10G甚至更大.如何将它迅速地加载到数据库指定的表呢?我们看看Sybase IQ是如何迅速地将表的数据加载到数据库的. 数据文件格式: 1440,2011-01-09 00:00:00,1,珠海,1,C网,8612345678222,221943,1,12175,1,12,14426467,1191632,9,1440,2011-01-09 00:00:00,1,珠海,1,C网,8612345678222,968852,1,82077,1,7,2430696,1349

sed-shell 大文件字符串替换

问题描述 shell 大文件字符串替换 我想在shell中将一个文件中的字符串替换为另一个字符串,现在使用sed全局替换,但是速度特别慢,后来发现全文没有换行符,大概10m的文件就一行,sed处理字符串都是以行为单位读到内存,在内容少的时候处理还挺快,多了就慢的不行,请问有什么方法可以解决这个问题? 解决方案 我去,别这么用啊,你这用法是让shell去从aaa文件读取,然后通过管道输入到sed的stdin,然后再重定向sed的输出到bbb: 这显然有更高效的办法: sed -s ""/

c-请教一个关于海量数据的大文件统计问题

问题描述 请教一个关于海量数据的大文件统计问题 有一个大文件 20多G 里面一行一行的(csv格式,逗号隔开的那种)都是订单信息 主要的有用户id 商户id 还有就是订单id 需要求出的就是求出"每个商户""每天的累计支付用户"和"每天的新增支付用户数" PS: 最好能贴出代码, 最好可以用C或C++,php也ok, 还有就是内存不是很大 需要考虑内存原因 我需要求出的"累计支付用户"和"新增支付用户数"的

php超快高效率统计大文件行数_php技巧

用php获取文件行数,网上给出的答案通常是使用file这样一次性读取,这样不适用在大文件.通常大文件大家用while来循环的逐行统计,这样的效率太慢 最快的方法是多行统计,每次读取N个字节,然后再统计行数,这样比逐行效率高多了. 测试情况,文件大小 3.14 GB 第1次:line: 13214810 , time:56.2779 s; 第2次:line: 13214810 , time:49.6678 s; /* * 高效率计算文件行数 * @author axiang */ function

小米新一代大数据统计平台大公开

首次来到台北的小米研发架构师欧阳辰,看见城市中川流不息的摩托车车流,引起了他的注意:「它的特色很像大数据」,除了数量多.变化快,以及难以预测动向,摩托车也和大数据一般,都是解决人类生活在社会中的一项工具,「未来大数据会是重要的社会基础架构,就像水.电力一样.」 谈起大数据,不免回归最基本的问题:它跟传统数据分析的区隔为何. 欧阳辰表示:「在目标上,我认为两者没有区隔」,欧阳辰表示,传统统计分析解决的问题如人口统计议题,只需要经过随机抽样方法就能解决.但是碰上投放商业广告,若仍靠传统抽样分析结果,

IBM将收购大文件传输技术公司Aspera 布局大数据

12月20日消息,据国外http://www.aliyun.com/zixun/aggregation/31646.html">媒体报道,IBM周四宣布,将收购私有化大文件传输技术公司Aspera.但有关双方公司的交易细节信息未公布. IBM表示,Aspera的文件传输技术将会成为公司旗下未来大数据战略的关键组成. Aspera的技术能让较大规模的文档数据以较快速率传输--如通常需要26小时将一份体积为24GB的文档传输至世界的另一端,而Aspera能做到只需30秒.Aspera将其技术命

从政府统计到政府大数据统计

在互联网大数据发展中,要把各种各样的数据链接到具有统计思想.统计标准.统计流程.统计方法的科学过程上,形成互联网云技术状态的大数据统计,从而为创造新的大数据生态提供统计科学理论方法,也为与外部无缝连接成大系统数据体系.推动全社会产业分工合作.创造更大的生产力,提供统计工具.因此,统计学本身的发展,也要求政府统计成为政府大数据统计. 统计形式主要表现为统计数据和统计分析,统计数据是统计分析的基础,但在政府统计形式上,则主要从数据出发.统计设计.统计调查及数据搜集整理追求的是一个能够描述一个国家全部

网络已成播放营销主阵地 大数据助力影视数据统计

我常常追热播的电视剧,但是很少打开电视,都是从网上看.""90后"张晓这样说.像她一样,有越来越多的人已经改变了传统习惯,选择从网络而非电视上收看影视剧. 在这样的收视环境下,线上数据成为了影视剧播放.营销的主阵地.云合数据首席执行官李雪琳认为,"就中国影视剧市场而言,内容的变现方式已经逐渐转移到网络上,使数据的重要性得到了极大的提升."那么影视数据线上统计现状如何?未来又会有何新趋势呢? 现状:繁荣与虚假并存 "吴刚老戏骨,演得真好"