6

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

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

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

4

2 回答 2

21

如果没有更多关于您的问题的详细信息,则无法提供太多帮助。你想并行化一个过程。Perl 中的线程和分支各有优缺点。

使 Perl 线程与其他线程不同的关键之一是默认情况下不共享数据。这使线程更容易和更安全地使用,您不必担心库或大多数代码的线程安全,只需担心线程位。然而,由于 Perl 必须将解释器的副本和所有加载的模块放入每个线程中,这可能会导致性能下降和内存消耗。

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

分叉优势

  • 创建分叉非常快
  • 非常坚固

分叉的缺点

  • 进程之间的通信可能很慢而且很尴尬

线程优势

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

线程缺点

如果文档是最新的,那么最后一个有点笨拙。如果您要执行大量 SQL,请不要使用线程。

一般来说,要从 Perl 线程中获得良好的性能,最好启动一个线程池并重用它们。可以更轻松地创建、使用和丢弃分叉。

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

无论哪种情况,您都可能需要一些东西来管理您的员工池。对于分叉,您将要使用Parallel::ForkManagerChild。Child 特别好,因为它内置了进程间通信。

对于线程,您将要使用threads::sharedThread::Queue并阅读perlthrtut

在阅读有关 Perl 线程的文章时,请记住它们在 2002 年在 5.8.0 中引入时有点垃圾,并且只能在 5.10.1 中使用。在那之后,他们已经相当坚定了。关于其效率和稳健性的信息和意见往往会很快过时。

于 2013-04-28T03:22:11.893 回答
1

线程可能更难以正确处理,但不会占用太多内存。

分叉可以更简单地实现,但会使用大量内存。

如果您都没有这方面的经验,我将首先实施一个分叉版本并从那里开始。

于 2013-04-28T01:38:26.927 回答