Chinaunix首页 | 论坛 | 博客
  • 博客访问: 504272
  • 博文数量: 65
  • 博客积分: 2925
  • 博客等级: 上尉
  • 技术积分: 1306
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-01 10:56
个人简介

2013

文章分类

全部博文(65)

分类: LINUX

2012-10-26 15:41:07

dump_test_file.sql 文件大小4.2GB
1.过滤单个条件:
$ time cat -n dump_test_file.sql |egrep "CREATE DATABASE \/\*\!32312 IF NOT EXISTS\*\/"
  2326  CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db1` /*!40100 DEFAULT CHARACTER SET utf8 */;
10594  CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db2` /*!40100 DEFAULT CHARACTER SET latin1 */;
14254  CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db3` /*!40100 DEFAULT CHARACTER SET utf8 */;

real    0m11.936s
user    0m7.358s
sys     0m12.659s

2.过滤单个条件
$ time cat -n dump_test_file.sql |egrep "Dump completed on"
14628  -- Dump completed on 2012-05-19  4:01:32

real    0m12.569s
user    0m8.986s
sys     0m11.718s

3.合并过滤上面2个条件:
$ time cat -n dump_test_file.sql |egrep "CREATE DATABASE \/\*\!32312 IF NOT EXISTS\*\/|Dump completed on"
  2326  CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db1` /*!40100 DEFAULT CHARACTER SET utf8 */;
10594  CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db2` /*!40100 DEFAULT CHARACTER SET latin1 */;
14254  CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db3` /*!40100 DEFAULT CHARACTER SET utf8 */;
14628  -- Dump completed on 2012-05-19  4:01:32

real    3m8.444s
user    3m3.850s
sys     0m13.049s

为什么第三次执行的时间,比前面2次时间相加还久???

还好egrep 过滤3个或更多条件时,过滤的时间跟2个条件差不多 。。。
上面执行过滤的时候用了cat -n 是因为需要知道过滤出来的结果的所在行号;若直接用egrep的话,执行速度会快5%左右;

还测试一下,过滤一个230GB的文件,单个条件的过滤需要19分钟,当时的IO 读 220rMB/s,egrep 单线程cpu使用率大约20%;而过滤2个(或2个以上)条件的话,则大概需要3小时,当时IO 读 23rMB/s,egrep 单线程cpu使用率大约90%;



***********************************************
有个网友建议加-P参数
在这个例子中,如果将改成 :
time grep -n -P  "CREATE DATABASE \/\*\!32312 IF NOT EXISTS\*\/|Dump completed on" dump_test_file.sql
***过滤结果省略****
real    0m11.117s
user    0m10.009s
sys     0m1.106s

grep过滤多条件的速度会快很多,在这里-P参数挺有用的
       -P, --perl-regexp
              Interpret PATTERN as a Perl regular expression.

对于大文件来说-F会更加快,消耗的cpu更加少,单线程cpu 40% 左右;上面的其他grep操作时,cpu在80%-95%之间
如:time grep -n -F -e 'CREATE DATABASE /*!32312 IF NOT EXISTS*/' -e 'Dump completed on' dump_test_file.sql

***过滤结果省略****

real    0m4.453s
user    0m3.290s
sys     0m1.163s


之前用grep时,基本上都是小文件,结果很快就出来了;
最近用grep从几GB,甚至几百GB的文件中,过滤多条件的时候,效率问题就出来了;
还好grep有相关的参数,加上-P,特别是加上-F参数时,会比不加参数快很多。



阅读(7450) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~