`
wbj0110
  • 浏览: 1610581 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

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脚本生成这个文件,很可能这个随机数中不会出现重复,但是我们假设这里面会有重复的数字出现。

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

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

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

1 split -l 1000000 -a 3 qq.txt qqfile

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

01 $results array();
02 foreachglob('/tmp/qq/*'as $file ){
03     $fp fopen($file,'r');
04     $arr array();
05     while$qq fgets($fp) ){
06         $qq = trim($qq);
07         isset($arr[$qq]) ? $arr[$qq]++ : $arr[$qq]=1;
08     }
09     arsort($arr);
10     //以下处理方式存在问题
11     do{
12         $i=0;
13         foreach$arr as $qq=>$times ){
14             if$i > 10 ){
15                 isset($results[$qq]) ? $results[$qq]+=$times :$results[$qq]=$times;
16                 $i++;
17             else {
18                 break;
19             }
20         }
21     while(false);
22     fclose($fp);
23 }
24 if$results ){
25     arsort($results);
26     do{
27         $i=0;
28         foreach$results as $qq=>$times ){
29             if$i > 10 ){
30                 echo $qq "\t" $times "\n";
31                 $i++;
32             else {
33                 break;
34             }
35         }
36     while(false);
37 }

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

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

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

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

分享到:
评论

相关推荐

    Shell 分析日志文件高效命令详解.docx

    这条命令将 log_file 文件中的每一行数据都输出到标准输出,然后使用 sort 和 uniq 命令对输出结果进行排序和去重,最后使用 wc 命令统计输出结果的行数。 2. 查看某一个页面被访问的次数 使用 grep 和 wc 命令...

    大数据综合案例-网站日志分析

    计算公式:按访问次数统计排序。 开发步骤 1. 需要用到的技术:Linux Shell 编程、HDFS、MapReduce、HBase、Hive、Sqoop 框架。 2. 上传日志文件至 HDFS:把日志数据上传到 HDFS 中进行处理,可以分为以下几种...

    shell入门到进阶,脚本机动化

    根据给定的文件标题、描述、标签以及部分内容,本文将详细介绍与shell脚本相关的知识点,内容涵盖从入门到进阶的多个方面。 ### Shell 脚本自动化批量系统初始化 在自动化批量系统初始化方面,shell脚本能够实现一...

    Shell+Linux命令实现日志分析

    本文将详细介绍如何利用Shell和Linux命令来实现日志分析,特别是针对访问日志的统计。 1. 列出当天访问次数最多的IP: 使用`cut`命令以特定字符(通常是空格或逗号)分隔日志条目,提取IP地址(通常是第一字段),...

    最全的oracle常用命令大全.txt

    数据字典里存有用户信息、用户的权限信息、所有数据对象信息、表的约束条件、统计分析数据库的视图等。 我们不能手工修改数据字典里的信息。  很多时候,一般的ORACLE用户不知道如何有效地利用它。  dictionary...

    PHP与MySQL程序设计

    - **统计数组元素出现的频度**:使用`array_count_values()`。 - **确定唯一的数组元素**:使用`array_unique()`。 - **数组排序** - **逆置数组元素顺序**:使用`array_reverse()`。 - **置换数组键和值**:...

    linux面试题

    2. **sort 命令:** 对文件中的行进行排序。 3. **uniq 命令:** 过滤相邻重复的行。 4. **uniq -c 命令:** 统计相邻重复行的数量。 5. **head 命令:** 输出文件的头部若干行。 **示例代码:** ```bash awk '{...

    HBase技术介绍.docx

    - **Pig和Hive**: 提供高级语言支持,简化数据统计处理流程。 - **Sqoop**: 用于轻松地将关系型数据库管理系统(RDBMS)中的数据迁移到HBase。 #### 四、HBase的数据模型 ##### 1. **Table & Column Family** - **...

    Hadoop之HBase简介

    HBase是一种基于Hadoop生态系统的分布式列式存储系统,它为大数据处理提供了高效、可靠且可扩展的解决方案。HBase的设计灵感来源于Google的Bigtable,但它是开源的,旨在适应低成本的PC服务器集群,用于构建大规模...

    程序员攻略

    - **项目二**:遍历本地文件系统,统计一个目录及其子目录下所有文件的大小,并按大小排序后输出结果。 - **项目三**:与数据库交互,利用Python连接SQLite数据库,实现对数据的增删查改操作。 2. **掌握一种高效...

    第3篇:Web日志分析.pdf

    - **统计分析**:利用脚本或工具统计访问频次、来源等数据,快速定位问题区域。 #### 四、常用分析工具与命令 - **Linux环境**: - **Shell命令**:如`grep`、`awk`、`sort`、`uniq`等。 - `grep`:用于搜索匹配...

    Hadoop之Hbase从入门到精通.doc

    5. Pig:可以使用Pig Latin流式编程语言来操作HBase中的数据,和Hive类似,本质最终也是编译成MapReduce Job来处理HBase表数据,适合做数据统计 6. Hive:当前Hive的Release版本尚没有加入对HBase的支持,但在下一个...

    Linux命令术语全称

    - **含义**:比较两个已排序的文件,并找出它们的共同部分。 - **用途**:查找两个文件之间的公共行。 32. **cp=CoPy** - **含义**:复制文件或目录。 - **用途**:将文件从一个位置复制到另一个位置。 33. **...

    Hadoop之Hbase从入门到精通 .doc

    * Pig:可以使用 Pig Latin 流式编程语言来操作 HBase 中的数据,和 Hive 类似,本质最终也是编译成 MapReduce Job 来处理 HBase 表数据,适合做数据统计。 * Hive:可以使用类似 SQL 语言来访问 HBase,当前 Hive ...

    linux-101-hacks

    - **Sort命令**:用于排序文本文件。 - **Uniq命令**:Uniq用于去除文件中重复的行。 - **Cut命令**:用来显示文件中选定的部分。 - **Stat命令**:提供文件或文件系统的状态信息。 - **Diff命令**:比较文件或文件...

    Kaltura--API.zip_Kaltura

    4. **内容管理**: 可以通过API进行视频元数据的编辑、分类、搜索和排序。例如,使用`metadata`服务添加、更新或检索视频信息。 5. **权限控制**: Kaltura API支持访问控制,可以设置不同用户或组对视频的访问权限。...

    java开源包1

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包11

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包2

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

Global site tag (gtag.js) - Google Analytics