2009年6月10日星期三

[PerlChina] Re: 多进程并行处理多文件,使用共享内存

On 6/6/09, Gene <netgene@hotmail.com> wrote:
> 需求:有一批文件待处理,每个文件都比较大。需要筛选有用的数据到文件。
>
> 实现:想用多进程实现,主进程按文件数平均分配给10个子进程处理;子进程筛选需要的行PUSH到共享内存的数组里。处理完毕最终打印数组数据到文
> 件。
>

如果这些文件的数据量真的很恐怖的话,比如几个 GB,感觉用新浪那哥们的 memcacheq 挺合适的,哈哈,各个 worker
进行还可以跨机器,hoho~(我们已经在用经过我们改进之后的 memcacheq 去调度我们的 WebKit 网页视觉抽取集群了 ;))

http://memcachedb.org/memcacheq/

否则如 qiang 所言,先在当前 perl 进程中建一个只读的任务队列,然后不断地 fork 出 worker
进程,去取队列自己所属的那一部分(比如通过 hash 方法)。结果的汇总可以简单地通过磁盘文件。

如果不怕 perl 的 ithread 报 pool 错误意外崩溃的话,可以考虑用 Thread::Queue 模块:

http://search.cpan.org/perldoc?Thread::Queue

几年前我在 Win32 上经常使的,还真挺好使的。感谢我们的 perl thread 女王的杰作!下面这个是我在 04 ~ 05
年写的一个从 CNN 网站抓取首页指向的所有新闻文章的小脚本,就是通过 Thread::Queue 再加
Thread::Semaphore:

http://svn.berlios.de/svnroot/repos/unisimu/Perl/GetCNN/getcnn.pl

如果不用 Thread::Queue,单用 Thread::Semiphore 好像也可以比较方便地实现。比如我的这个 N
年前写的自动筛选免费 proxy 列表的并行测试脚本:

http://svn.berlios.de/svnroot/repos/unisimu/Perl/TestProxy/test-proxy.pl

Cheers,
-agentzh

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---

没有评论: