免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: zhangmaocun
打印 上一主题 下一主题

求程序或者思路 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2013-03-29 09:43 |只看该作者
回复 4# zhangmaocun


    fork. 一般情况下耗时的中间过程在算法上是可以继续优化的。

论坛徽章:
0
12 [报告]
发表于 2013-03-29 10:20 |只看该作者
楼主已经有并行处理的概念,这个不是光使用语法和模块能解决的,需要分配组合工作:

关于效率的问题:

尽量使用字符串引用,而不是传递字符串本身。

分配工作,将一个大文件拆分成大小均等的小文件。
分发这些文件到一个机器的不同进程或不同机器的不同进程
将计算结果组合在一起
用一个程序将结果合并在一起

这个不但有程序的工作,也有人的工作。
在一个充分快的机器上分配,可以用多进程。
在多个机器上分配,就需要人的工作了。

方式很多,思路差不多。

论坛徽章:
0
13 [报告]
发表于 2013-03-29 11:33 |只看该作者
laputa73 发表于 2013-03-29 09:35
既然已经有了文件
不明白你要多线程干什么用
直接多进程,从不同的偏移量开始读就ok了

给个例子啊。。。

论坛徽章:
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
14 [报告]
发表于 2013-03-29 14:06 |只看该作者
seek FILEHANDLE,POSITION,WHENCE  
http://blog.sina.com.cn/s/blog_4af3f0d20100eou6.html

论坛徽章:
0
15 [报告]
发表于 2013-04-01 15:41 |只看该作者
laputa73 发表于 2013-03-29 09:35
既然已经有了文件
不明白你要多线程干什么用
直接多进程,从不同的偏移量开始读就ok了

多进程的话,怎么让主程序等待所有的子进程结束后才执行后面的操作呢?

论坛徽章:
0
16 [报告]
发表于 2013-04-01 15:41 |只看该作者
picbhan 发表于 2013-03-29 09:43
回复 4# zhangmaocun

给个主进程等待所有子进程的例子呗。

论坛徽章:
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
17 [报告]
发表于 2013-04-01 15:50 |只看该作者
回复 15# zhangmaocun

如果需要等待
    http://search.cpan.org/~szabgab/ ... llel/ForkManager.pm

或者你可以轮询啊.子进程自己维护状态,主进程定时检查.
这样耦合最小.
最简单的往往是最有效的.
   

论坛徽章:
0
18 [报告]
发表于 2013-04-01 15:56 |只看该作者
回复 17# laputa73


        my $pid = fork();
    if (!defined($pid)) {
        print "Error in fork: $!";
        exit 1;
    }
    if ($pid == 0) {
        ## == child proc ==
        print "Child: My pid = $$\n";
        process($temp,$id);
        exit 0;
    }
这个的怎么去判断子进程全执行完了。baidu搜到的全不行。。。。

论坛徽章:
0
19 [报告]
发表于 2013-04-01 16:28 |只看该作者
本帖最后由 zhangmaocun 于 2013-04-01 17:11 编辑

回复 17# laputa73

上面的这样写, 把一个数组里的数据每20w行生成一个进程去处理,没执行了一个进程,清空一下临时数组,可是 @temp=();这句总是不了啊。。。大大给优化优化



my $pm = Parallel::ForkManager->new(30);
foreach my $lines(@all_line) {
           $rows++;
        push(@temp,$lines);
    if ( ($rows % 200000)==0 || $rows==@all_line) {
                $id++;
                print "$id\n";
                  my  $temp=\@temp;
             $pm ->start and next;
              process($temp,$id);
              @temp=();
              $pm->finish;
    }
}
$pm->wait_all_children;
print "ok\n";


中间再增加个临时数组:这样能实现,感觉有点不爽。。。
my $pm = Parallel::ForkManager->new(30);
foreach my $lines(@all_line) {
           $rows++;
        push(@temp,$lines);
    if ( ($rows % 200000)==0 || $rows==@all_line) {
                $id++;
                print "$id\n";
                my @temp1=@temp;
                my  $temp=\@temp1;
                undef(@temp);
             $pm ->start and next;
              process($temp,$id);
              @temp=();
              $pm->finish;
    }
}

$pm->wait_all_children;
print "ok\n";

论坛徽章:
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
20 [报告]
发表于 2013-04-01 17:22 |只看该作者
回复 18# zhangmaocun


可以用sigchld和waitpid
http://blog.csdn.net/politefish/article/details/5567207
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP