免费注册 查看新帖 |

Chinaunix

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

关于脚本执行效率的问题!(太慢)!(结帖) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-10 09:25 |只看该作者 |倒序浏览
还说那个读xml文件,进行匹配的问题:
替换程序大致如下:
filename是网页文件,通过参数指定!

  1. while read url keyword urlto
  2. do
  3.         #echo sed -i "s@<a href=[^>]*>${keyword}</a>([^)]*)@${keyword}@g;s@${keyword}@${url}@g" $pathname$tmp
  4.         #echo $url
  5.         #echo $keyword
  6.         #echo $urlto
  7.         sed -i -e "s@\&lt;@gmmlt@g" -e "s@\&gt;@gmmgt@g" $filename
  8.         sed -i "s@<a href=[^>]*>${keyword}</a>([^)]*)@${keyword}@g" $filename
  9.         sed -i -e ':a;$!{N;ba}' -e "s@${keyword}@${urlto}@" $filename
  10.         sed -i -e "s@gmmlt@<@g" -e "s@gmmgt@>@g" $filename
  11. done    < /root/stock/zzz
复制代码


我用./script filename执行的时候,估算一下至少5秒以上,我要替换的网页文件数量上百万了,时间就没法算啦啊!
如何能解决这个替换过慢的问题呢?

  1. [root@cache251-216 stock]# time ./filemm.sh 1.html

  2. real    0m8.548s
  3. user    0m1.955s
  4. sys     0m7.117s
复制代码

[ 本帖最后由 linuxnextyear 于 2008-3-19 17:18 编辑 ]

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
2 [报告]
发表于 2008-01-10 09:40 |只看该作者
为啥进行了4次sed,不能合并成1次么?

论坛徽章:
0
3 [报告]
发表于 2008-01-10 09:41 |只看该作者
1.把内存虚拟成硬盘,文件放虚拟盘里处理可以加点速。
2.用c写工具替换吧,shell在速度上不可能超过程序语言,他本来就是解释语言。
3.sed换成awk/perl实现,后两者的处理速度要比sed快,耗资源也更多(相比c写出来的还是很慢)。

论坛徽章:
0
4 [报告]
发表于 2008-01-10 09:47 |只看该作者
原帖由 ly5066113 于 2008-1-10 09:40 发表
为啥进行了4次sed,不能合并成1次么?


第二句sed必须在第一句sed的对整个文件替换完成才能执行,
第三句sed必须在第二句sed的对整个文件替换完成才能执行,
第四句sed必须在第三句sed的对整个文件替换完成才能执行,
这样可以写在一一句嘛?

论坛徽章:
0
5 [报告]
发表于 2008-01-10 09:48 |只看该作者
半路过来,看的不是很明白.

为什么不替换写在一起? 分开写?  -i有点慢的.

read url keyword urlto ?  文件?  for in 可能快点吧

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
6 [报告]
发表于 2008-01-10 09:49 |只看该作者
原帖由 linuxnextyear 于 2008-1-10 09:47 发表


第二句sed必须在第一句sed的对整个文件替换完成才能执行,
第三句sed必须在第二句sed的对整个文件替换完成才能执行,
第四句sed必须在第三句sed的对整个文件替换完成才能执行,
这样可以写在一一句嘛?


那就把整个文件都读到pattern space,在做替换。

论坛徽章:
0
7 [报告]
发表于 2008-01-10 09:50 |只看该作者

回复 #4 linuxnextyear 的帖子

可以

论坛徽章:
0
8 [报告]
发表于 2008-01-10 09:51 |只看该作者
循环 外部命令fork sed -i又使用临时文件。。
看着就慢

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
9 [报告]
发表于 2008-01-10 09:55 |只看该作者
还是从0开始吧,给点实际的数据,和你想要的结果。
读已经写好的脚本比自己写个还累。

论坛徽章:
0
10 [报告]
发表于 2008-01-10 09:58 |只看该作者
原帖由 galford433 于 2008-1-10 09:41 发表
1.把内存虚拟成硬盘,文件放虚拟盘里处理可以加点速。
2.用c写工具替换吧,shell在速度上不可能超过程序语言,他本来就是解释语言。
3.sed换成awk/perl实现,后两者的处理速度要比sed快,耗资源也更多(相比c ...


不建议2,对于大部分人来说,没有能力写出一个bug-free的替换工具来,还是使用更高效的工具或者优化脚本程序本身来考虑吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP