所以,在发表这篇文章之前,我已经评论了大量的文章和论坛,但我一直在阅读相互矛盾的答案。首先,操作系统不是问题,我可以使用Windows或Unix,任何最适合我的问题。我有大量的数据需要用于只读目的(不确定这有什么关系,但以防万一,我必须处理的数据结构是由散列值也是数组的数组组成的数组)。我本质上是将一个“查询”与大量不同的“句子”进行比较,并计算它们的相对相似度。从这些数量(几百万)中,我想要取最高的x%,并用它们做一些事情。我需要将这个过程并行化。对于我来说,没有什么好的方法来减少空间--我需要比较所有的东西才能得到好的结果,而且使用某种线程/分支会花费太长的时间。再一次,我看到了许多相互矛盾的答案,不知道该怎么做。
任何帮助都将不胜感激。提前谢谢。
编辑:我认为内存使用量不会成为问题,但我不知道(8 GB RAM)
发布于 2013-04-28 11:22:12
如果没有更多关于你的问题的细节,就不会有太多的帮助。您希望并行化一个进程。Perl中的线程和fork各有优缺点。
Perl线程不同于其他线程的关键一点是,默认情况下不共享数据。这使得线程更容易和更安全地使用,你不必担心库或大多数代码的线程安全,只需担心线程部分。然而,这可能会拖累性能和耗费大量内存,因为Perl必须将解释器的副本和所有加载的模块放入每个线程中。
当涉及到forking时,我将只讨论Unix。Perl使用线程在Windows上模拟fork,它可以工作,但它可能很慢且有but。
派生优势
的分支劣势
进程之间的
线程优势
的线程劣势
每个线程占用大量的memory
越新越好(
如果文档是最新的,那么最后一个就有点小问题了。如果您要执行大量SQL操作,请不要使用线程。
一般而言,要获得Perl线程的良好性能,最好启动一个线程池并重用它们。可以更容易地创建、使用和丢弃Forks。
实际上,归根结底是什么适合你的思维方式和你的特定问题。
无论是哪种情况,您都可能需要一些工具来管理您的员工池。对于forking,你会想要使用Parallel::ForkManager或Child。Child特别好,因为它内置了进程间通信。
对于线程,你需要使用threads::shared,Thread::Queue和read perlthrtut。
在阅读有关Perl线程的文章时,请记住,当它们在2002年的5.8.0中引入时,它们有点废话,并且只能在5.10.1版本中使用。在那之后,他们变得相当坚定。关于它们的效率和健壮性的信息和观点往往很快就会过时。
发布于 2013-04-28 09:38:27
线程化可能更难得到正确的结果,但不会使用那么多的内存。
Forking可以更简单地实现,但会使用大量的内存。
如果您没有使用这两个版本的经验,我将从实现一个分支版本开始&从那里开始。
https://stackoverflow.com/questions/16258191
复制相似问题