免费注册 查看新帖 |

Chinaunix

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

关于perl的高效性 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-24 20:34 |只看该作者 |倒序浏览
大家好,我在工作时,有这样一个问题,想请教大家一下:

有很多xml文件,每个都挺小,大概几十k,但是很多。。大概每个文件夹里有700M左右的数据量。。 xml文件里面的内容具体详见附件,

我这边的程序所进行的工作就是:解析每个xml文件,然后将得到的数据放入指定txt文件中。  程序也在附件中。
(程序的执行命令举例为: hw_parser.pl -s '2013-04-24 05:00:00' -e '2013-04-24 06:00:00' -i '原始文件路径' -o '801' -t '1234' -d '目标路径')


但是现在遇到了这样一个问题,时间特别慢。。这样的情况下 700M的数据解析用了半个小时。。

程序中,我用了ForkManager模块,以及xml模块。。  

所以想问下大家 有什么办法能帮我提下速。。我没有办法了{:3_201:}

希望哪位朋友帮帮忙  帮我分析一下,对我进行一下指点,最慢10分钟也可以呀。。半个小时太长了

程序和原始文件都在附件中。原始文件我提取了一些,太多了没办法传。。

希望大家帮帮我 感激不尽!!!

程序 原始文件.rar (30.25 KB, 下载次数: 24)

论坛徽章:
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
2 [报告]
发表于 2013-04-24 21:40 |只看该作者
你这里用 fork 可能还拖慢速度了,学下 NYTProf 的用法看下瓶颈在哪里

论坛徽章:
27
水瓶座
日期:2014-08-22 21:06:34程序设计版块每日发帖之星
日期:2015-11-25 06:20:0015-16赛季CBA联赛之新疆
日期:2015-12-19 19:05:48IT运维版块每日发帖之星
日期:2015-12-25 06:20:31IT运维版块每日发帖之星
日期:2015-12-25 06:20:31IT运维版块每日发帖之星
日期:2015-12-25 06:20:3315-16赛季CBA联赛之上海
日期:2016-04-15 19:51:31程序设计版块每日发帖之星
日期:2016-04-17 06:23:29程序设计版块每日发帖之星
日期:2016-04-23 06:20:00程序设计版块每日发帖之星
日期:2016-05-26 06:20:00每日论坛发贴之星
日期:2016-05-26 06:20:0015-16赛季CBA联赛之辽宁
日期:2017-02-16 23:59:47
3 [报告]
发表于 2013-04-24 22:46 |只看该作者
  1. my $MAX_PROC = 15;
复制代码
你有没有试过加大或小,对程序有什么变化

论坛徽章:
0
4 [报告]
发表于 2013-04-25 08:26 |只看该作者
回复 3# shijiang1130


    嗯试过 依据系统的性能来进行调配的。但是最优的一次 也得20分钟+。。{:3_201:}

论坛徽章:
0
5 [报告]
发表于 2013-04-25 08:37 |只看该作者
回复 2# zhlong8


    你好,谢谢你的提议,我现在去看下相关的文档。
   但是由于这个工作确实比较急,所以我担心来不及学习完测试。。等我有时间了一定会学习下这个技术,以后尝试自己排查一下。

  我昨天晚上想到一个办法:如果尝试一下,多进程 然后每个进程之中再使用多线程,分别解析每个xml文件,以你的经验来看 可行吗?

我想到的是开启N个进程 每个进程之中 在使用M个线程分别进行依次解析xml文件,今天早上准备尝试一下。
(N和M依据机器配置来进行调配)

  公司配置的是小型机,机器的性能,只要在合理范围内,一般不是太大问题。

论坛徽章:
0
6 [报告]
发表于 2013-04-25 08:55 |只看该作者
1G以内的数据,如果复杂度不是太高,目前主流的计算机配置,PERL解析时间应该都在1分钟以内。一般似乎不需要多进程和多线程,如版主所说,可能还会拖慢速度。

论坛徽章:
42
19周年集字徽章-周
日期:2019-10-14 14:35:31平安夜徽章
日期:2015-12-26 00:06:30数据库技术版块每日发帖之星
日期:2015-12-01 06:20:002015亚冠之首尔
日期:2015-11-04 22:25:43IT运维版块每日发帖之星
日期:2015-08-17 06:20:00寅虎
日期:2014-06-04 16:25:27狮子座
日期:2014-05-12 11:00:00辰龙
日期:2013-12-20 17:07:19射手座
日期:2013-10-24 21:01:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34IT运维版块每日发帖之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之新疆
日期:2016-06-07 14:10:01
7 [报告]
发表于 2013-04-25 10:22 |只看该作者
尽量不用xml模块,改成自己用正则
不要用fork,直接通过sh起多进程,一般10个足够,可以根据文件名的规则,让这10个进程互不干扰
一个目录下的文件不能太多,原则上不要上万,不然列文件目录就会很耗时
所以要避免处理程序多次列目录操作

论坛徽章:
0
8 [报告]
发表于 2013-04-25 11:46 |只看该作者
回复 6# iamlimeng


    你好 我发现瓶颈了 就是假设这次的文件有1万个, 之后我分别解析,生成了一系列的临时txt, (这些txt也是1万个)

之后我需要将这1万个txt临时文件,写入一个txt目标文件。 这一步骤耗时较长。
(简练的说:就是解析1万个文件 每个文件生成一个临时txt解析好的数据, 之后这些数据全部导入到一个名字为dest.txt的文件中。)
(#注:其中这1万个文件中 每个文件大概数据量为几十K)

请问遇到这种问题,有什么办法可以进行解决吗?

我想的是 把这些解析后的txt数据,分批放入多进程,之后每个进程里 将txt再分别写入一个临时txt  之后每个进程的临时txt 再汇总至最终txt里
实现方法如下:
   (a,b,c) (d,e,f) (h,i,g,k)          #假设一万个txt
      |          |         |  
     X          Y        Z               #假设3个进程 那么把1万个分3份 每份3000+   分别执行
       \         |        /
             最终txt                    #之后将2步得到的3个txt录入最终txt.


不知道这个效率是否会提高?

或者各位朋友 谁有更好的办法来对付这个多对一的过程 麻烦给我说下 感激不尽!!{:3_193:}


论坛徽章:
0
9 [报告]
发表于 2013-04-25 11:55 |只看该作者
回复 8# BuTa丶潇


    你不妨试一下不用多进程,按顺序解析,如果数据量不是特别大,内存够大,就直接放内存,解析完一次性写入;否则边解析边写入结果文件。总之,尽量减少生成的文件数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP