dump_test_file.sql 文件大小4.2GB1.过滤单个条件:$ 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.936suser 0m7.358ssys 0m12.659s2.过滤单个条件$ time cat -n dump_test_file.sql |egrep "Dump completed on"14628 -- Dump completed on 2012-05-19 4:01:32real 0m12.569suser 0m8.986ssys 0m11.718s3.合并过滤上面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:32real 3m8.444suser 3m3.850ssys 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参数时,会比不加参数快很多。
阅读(7563) | 评论(0) | 转发(0) |