免费注册 查看新帖 |

Chinaunix

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

一个困扰我很久的问题,perl程序占用cpu多的问题! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-06-01 11:40 |只看该作者 |倒序浏览
我的程序主要用来分析文件并进行统计!
文件一般大小为1M或者20M两种,但是对应程序的cpu占用率都很高!非常让人不爽!不知道哪位高手可以告诉我能有效降低cpu占用率的,sleep除外,因为程序需要能尽快的运行处理,:)
下面是我程序里的一个sub,是用来统计文件中记录跨越的日期的。我单独拿出来跑,发现它运行时cpu有时也会高达90%以上,我后面还有好多复杂的统计,怪不得cpu那么高!不晓得哪位高手可以指点一二,可以有效降低cpu的占有率,十分感激!
#!/usr/bin/perl
system("date +%Y-%m-%d-%H-%M-%S____start";
#for ($i=1;$i<=10;$i++)
#{
#        $count=`grep -v "mbox.monternet.com"  /home/example.txt|grep -v "java.monternet.com"|grep -v "211.136.20.234"|grep -v "localhost:8080/status.html"|grep -v "mmsc.monternet.com"|grep -v "218.200.244.200"|grep -v "218.200.244.197"|grep -v "218.200.244.198"|grep -v "218.200.244.196"|grep -v "218.200.244.244"|grep -v "218.200.244.246"|grep -v "211.136.192.67"|grep -v "218.200.247.40"|grep -v "211.136.23.102"|wc -l`;
#        print("i=$i*********count=$count\n";
#}
#这部分注释的是调用grep做测试,发现其cpu占用率不高,最后就80%左右


#下面的是我真正程序里面的一部分
sub get_day
{
        @f_dir=@first_file;
        my %day_time;
        my $i=0;
        #20M的文件大概有6万多行记录
        while ($i<=$#f_dir) {
                $f_line=$f_dir[$i];
                @day_line=split(/,/,$f_line); #将记录按逗号分割
                $line_head=substr($day_line[7],0,10);#得到时间字段的日期部分
                $day_time{$line_head}=$day_time{$line_head}+1;#将日期放入hash表作为key
                $i++;
        }
        @f_day=keys(%day_time);#取得hash中的key,也就是所有的日期。
        return @f_day;
}

$file_dir="/home/example.txt";
open (FIRST_FILE,"<$file_dir" or die;
@first_file=<FIRST_FILE>;;
@day=get_day(@first_file);
print("day_count=$#day\n";#打印所有日期种类个数


system("date +%Y-%m-%d-%H-%M-%S____end";

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2005-06-01 12:58 |只看该作者

一个困扰我很久的问题,perl程序占用cpu多的问题!

@f_dir沒有release...因為是global variable...

所以將@first_file copy了一份....一直放在memory中...

@first_file如果不用..建議你也release掉...

請愛用 my 宣告..可以有效節省很多memory...memory少了...
swap的機會也就低了....

另外關鍵慢的地方就是..
@day_line=split(/,/,$f_line); #将记录按逗号分割
$line_head=substr($day_line[7],0,10);#得到时间字段的日期部分
這兩行....因為執行了6萬多次...這個動作很繁瑣且慢..

建議如果確定都是這樣子可能要想辦法減少..例如讀文件的時候
不要一次讀進來...一行一行讀,..整理完之後...再去做你的複雜統計...

论坛徽章:
0
3 [报告]
发表于 2005-06-01 14:47 |只看该作者

一个困扰我很久的问题,perl程序占用cpu多的问题!

原帖由 "apile" 发表:
;#得到时间字段的日期部分
這兩行....因為執行了6萬多次...這個動作很繁瑣且慢..

建議如果確定都是這樣子可能要想辦法減少..例如讀文件的時候
不要一次讀進來...一行一行讀,..整理完之後...再去做你的複雜統計..........


======================
非常感谢你的回复,那个全局数组变量是有问题!
但是那里的记录拆分,我必须要做啊!而且对象必须是整个文件的!
你的意思是说通过文件句柄来做?不要通过数组么?
这样速度反而会快?
======================
现在有新的一个问题:perl程序里面有没有什么方法可以使字符串变成代码的?
比如
$con="a or b";
if($con){...}
其中有什么方法可以使程序能明白$con是个程序段的?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2005-06-01 15:23 |只看该作者

一个困扰我很久的问题,perl程序占用cpu多的问题!

我的意思是要慢只要慢一次就好....ram要儘量減少...
既然@f_dir 跟@first_file一樣..乾脆只用@first_file就好..
2.要做六萬多次的 split , substr,那乾脆再讀file的時候就先split與將substr
做好...設計好structure...後面運算時直接就可以拿出來用...
會比較快....
你問的..可能可以用eval...有興趣去看看eval吧..

论坛徽章:
0
5 [报告]
发表于 2005-06-02 05:29 |只看该作者

一个困扰我很久的问题,perl程序占用cpu多的问题!

传文件句柄要比传数组快,如果可能,省掉subroutine。
改用regex来提取数据,可以省掉split and substr操作。
用nice来降低程序优先级,可以减小对其他程序的影响。

论坛徽章:
0
6 [报告]
发表于 2005-06-02 08:42 |只看该作者

一个困扰我很久的问题,perl程序占用cpu多的问题!

除了优化自己的代码外,我觉得也不必太计较cpu的占用率,如果有多个数据密集型的运算时,系统会自动调度,平均分配!占用率达到90%以上,说明你的系统大部分程序基本处于sleep状态,当然必要的时候可以使用nice调整!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP