免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2022 | 回复: 7
打印 上一主题 下一主题

perl 行读入大文件的问题 [复制链接]

论坛徽章:
8
双子座
日期:2013-08-31 07:37:12金牛座
日期:2013-09-09 18:49:12处女座
日期:2013-09-23 11:43:14处女座
日期:2013-10-09 19:48:21狮子座
日期:2014-03-24 18:22:12丑牛
日期:2014-04-22 22:07:51申猴
日期:2014-06-12 21:54:13双鱼座
日期:2014-06-13 21:52:31
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-06 14:10 |只看该作者 |倒序浏览
本帖最后由 kernel69 于 2013-01-06 14:10 编辑

工作中要查看日志,以前是用grep,现在想用perl来完成并在原来的命令上面又完善了一下,

以前用grep命令如下
  1. grep `date +%F` -A 100  -a  /usr/local/jboss/server/default/log/program.log|more
复制代码
现在用perl命令如下:
  1. perl -ne 'chomp($t=`date +%F`);print if /$t/ && !/\d{11}$/'  /usr/local/jboss/server/default/log/program.log|more
复制代码
发现perl在处理小于50M的文件时,速度还是可以,但超过50M后就得等好长时间,在执行时我用top观察perl只是占用CPU内存占用是0,按说用行读入模式应该读入一行处理一行并及时打印出来啊,请帮忙看一下,是我写的代码有问题?还是怎么样,perl读入文件内容的原理有怎样的?一次将整个文件全部读入然后处理?

论坛徽章:
8
双子座
日期:2013-08-31 07:37:12金牛座
日期:2013-09-09 18:49:12处女座
日期:2013-09-23 11:43:14处女座
日期:2013-10-09 19:48:21狮子座
日期:2014-03-24 18:22:12丑牛
日期:2014-04-22 22:07:51申猴
日期:2014-06-12 21:54:13双鱼座
日期:2014-06-13 21:52:31
2 [报告]
发表于 2013-01-06 14:52 |只看该作者
怎么没人回复啊,版主,帮忙看一下啊

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
3 [报告]
发表于 2013-01-06 15:25 |只看该作者
每一行数据就开一个进程

论坛徽章:
8
双子座
日期:2013-08-31 07:37:12金牛座
日期:2013-09-09 18:49:12处女座
日期:2013-09-23 11:43:14处女座
日期:2013-10-09 19:48:21狮子座
日期:2014-03-24 18:22:12丑牛
日期:2014-04-22 22:07:51申猴
日期:2014-06-12 21:54:13双鱼座
日期:2014-06-13 21:52:31
4 [报告]
发表于 2013-01-06 15:30 |只看该作者
能帮忙修改一下吗?
回复 3# zhlong8


   

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
5 [报告]
发表于 2013-01-06 15:30 |只看该作者
-n 相当于在开头结尾插入代码
  1. LINE:
  2. while (<>){
  3.     #-e 里面的代码
  4. }
复制代码
解决方法是让这个 `date %F` 只执行一次,一种方法是用 BEGIN 让它在编译期执行,运行时看不到这行代码自然也就不会循环了。
  1. perl -ne 'BEGIN{chomp($t=`date +%F`)} print if /$t/ && !/\d{11}$/'
复制代码

论坛徽章:
8
双子座
日期:2013-08-31 07:37:12金牛座
日期:2013-09-09 18:49:12处女座
日期:2013-09-23 11:43:14处女座
日期:2013-10-09 19:48:21狮子座
日期:2014-03-24 18:22:12丑牛
日期:2014-04-22 22:07:51申猴
日期:2014-06-12 21:54:13双鱼座
日期:2014-06-13 21:52:31
6 [报告]
发表于 2013-01-06 15:46 |只看该作者
本帖最后由 kernel69 于 2013-01-06 16:08 编辑

非常感谢版主,原来是chomp($t=`date +%F`),但我还是不太明白,为什么处理一行就开启一个进程?难道是chomp($t=`date +%F`)每执行一次就会开启一个进程?还是怎样?
回复 5# zhlong8


   

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
7 [报告]
发表于 2013-01-06 16:15 |只看该作者
回复 6# kernel69


    你用 grep 那个例子 shell 帮你处理过最终 grep 看到的是个字符串常量,而 Perl 代码上面不是说了有个隐藏的 while 循环,每次到 chomp($t=`date +%F`); 都会求值它,而 `` 会调用 shell

论坛徽章:
8
双子座
日期:2013-08-31 07:37:12金牛座
日期:2013-09-09 18:49:12处女座
日期:2013-09-23 11:43:14处女座
日期:2013-10-09 19:48:21狮子座
日期:2014-03-24 18:22:12丑牛
日期:2014-04-22 22:07:51申猴
日期:2014-06-12 21:54:13双鱼座
日期:2014-06-13 21:52:31
8 [报告]
发表于 2013-01-06 17:23 |只看该作者
哦,明白了,灰常感谢
回复 7# zhlong8


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP