2013-04-28 68 views
5

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

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

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

+1

的Perl吃比预期更多的内存。在你走之前,试着加载你的数据结构,看看会花多少钱,结果可能让你感到惊讶。 – 2013-04-28 00:57:12

+0

我在这里没有看到问题。 – jordanm 2013-04-28 01:16:20

+0

问题是,我应该使用什么:线程或分叉? – 2013-04-28 02:54:26

回答

16

没有关于你的问题的更多细节,没有太多可以给予的帮助。你想并行化一个进程。 Perl中的线程和叉具有优点和缺点。

使Perl线程不同于其他线程的关键之一是数据在默认情况下不被共享。这使得线程更容易和更安全地工作,您不必担心库或线程的大部分代码,线程安全。然而,它可能是一个性能拖拽和内存饿,因为Perl必须将解释器和所有加载的模块的副本放入每个线程中。

说到分叉,我只会谈论Unix。 Perl使用线程模拟Windows上的fork,它可以工作,但它可能很慢并且很麻烦。

分叉优点

  • 非常快创建一个叉
  • 非常健壮

分岔缺点

  • 进程间通信可以是SLO w和尴尬

线程优势

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

主题缺点

这最后一个是位如果文档是最新的,则可以使用它。如果你要做大量的SQL,不要使用线程。

一般来说,要获得良好表现出来的Perl线程这是最好的开始线程池并重新使用它们。叉子可以更容易地创建,使用和丢弃。

真的什么它归结为是什么适合你的思维方式和你的特殊问题。

对于这两种情况下,你可能会想要的东西来管理你的工人的储备。对于分叉,你会想要使用Parallel::ForkManagerChild。孩子特别好,因为它内置了进程间通信。

对于您想要使用的线程threads::shared,Thread::Queue和阅读perlthrtut

当阅读有关Perl的线程的文章,请记住他们是有点废话,当他们在5.8.0在2002年推出的,只有5.10.1维修。之后,他们已经相当稳固。关于他们的效率和健壮性的信息和意见往往会迅速过时。

+0

非常感谢! – 2013-04-28 03:30:18

+1

优秀的答案。 – squiguy 2013-04-28 03:47:44

+1

['use use;'](http://metacpan.org/module/forks) – Zaid 2013-04-28 08:02:59

0

线程可能更难以得到正确的,但不会使用尽可能多的记忆。

分叉可以更容易实现,但使用大量的内存。

如果你没有任何经验,我会开始执行分叉版&从那里去。

+2

在Perl中完全是另一种方式。 – Schwern 2013-04-28 03:10:59

+0

那么,你会建议穿线?由于线程会完全独立工作,直到他们吐出结果,我是否甚至需要使用'join()'之类的东西? – 2013-04-28 03:16:21

相关问题