微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

perl – 线程与分叉(解释我想做什么)

所以,在发布之前我已经回顾了大量的文章和论坛,但我一直在阅读相互矛盾的答案.首先,操作系统不是问题,我可以使用 Windows或Unix,无论哪种方式最适合我的问题.我有大量数据需要用于只读目的(不知道为什么这会很重要,但是,如果确实如此,我将要经历的数据结构是一个数组的数组哈希数组,其值也是数组).我基本上将“查询”与大量不同的“句子”进行比较并计算它们的相对相似性.从这些数量(几百万),我想采取顶部x%,并与他们做一些事情.我需要并行化这个过程.对我来说,没有什么好方法可以减少空间 – 我需要比较一切以获得良好的结果,并且只需要花费太长时间进行某种线程/分叉.我再次看到了许多相互矛盾的答案,并且不知道该做什么.

任何帮助,将不胜感激.提前致谢.

编辑:我不认为内存使用量将是一个问题,但我不知道(8 GB RAM)

解决方法

没有关于你的问题的更多细节,可以给出很多帮助.您想要并行化流程. Perl中的线程和叉子有优点和缺点.

使Perl线程与其他线程不同的一个关键因素是认情况下不共享数据.这使得线程更容易和更安全,您不必担心库或大多数代码的线程安全性,只需要担心线程位.然而,它可能是性能拖累和内存饥饿,因为Perl必须将解释器的副本和所有加载的模块放入每个线程中.

说到分叉,我只会谈论Unix. Perl使用线程在Windows上模拟fork,它可以工作,但它可能很慢而且有问题.

分叉优势

>创建一个分叉非常快
>非常强大

分叉缺点

>流程之间的沟通可能很慢而且很尴尬

线程优势

>线程协调和数据交换相当容易
>线程相当容易使用

线程缺点

>每个线程占用大量内存
>线程启动缓慢
>线程可能有错误(你的perl越近越好)
> Database connections are not shared across threads

如果文档是最新的,那最后一个有点麻烦.如果你要做很多sql,不要使用线程.

通常,为了从Perl线程中获得良好的性能,最好启动一个线程池并重用它们.可以更容易地创建,使用和丢弃叉子.

真正归结为什么适合您的思维方式和您的特定问题.

无论哪种情况,您可能都想要管理您的工作人员.为了分叉,你将要使用Parallel::ForkManagerChild.孩子特别好,因为它内置了进程间通信.

对于线程,您将要使用threads::shared,Thread::Queueperlthrtut.

在阅读有关Perl线程的文章时,请记住,当它们在2002年引入5.8.0时它们有点废话,并且只能通过5.10.1进行维护.在那之后他们已经相当坚定了.有关其效率和稳健性的信息和意见往往会过时.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐