2012-03-17 263 views
1

我有一个概念性问题。减少运行时间

假设我有一个过程(任何语言),它将一个数据集作为输入,处理它并将输出写入数组。该阵列在流中使用以进一步处理。问题是代码运行时间很长。这么大以至于需要优化!

我建议的是将输入数据集划分为更小的块,并为每个数据集并行调用过程。听起来很简单!

因此我想在独立的文件中编写程序,创建一个单独的可执行文件。提交此可执行文件以用于批量处理的较小数据集。

但是这种方法的问题是,因为每个批处理作业都是一个单独的进程,所以这些作业如何创建我之前创建的数组!我可以考虑将每个作业输出写入文件,然后处理它们以创建阵列。

有没有更好的方法可以并行处理?说

感谢您的建议:)

+4

您正在描述[MapReduce](http://en.wikipedia.org/wiki/Map_Reduce)。 – 2012-03-17 01:10:57

+0

感谢您通知。我对此一无所知。任何理想的,如果它可以免费获得,如果它会使用它很多工作? – Richeek 2012-03-17 01:24:23

回答

1

我认为它看起来像MapReduce。

您可能想看看Erlang,它支持跨进程,处理器和机器进行分区和分配工作的非常优雅的方式。

Joe Armstrong的Erlang书籍“Programming Erlang - 一个并发世界的软件”给出了一个简单的MapReduce,可以跨进程使用。

我发现这些博客这谈论乔的简单的MapReduce:
http://bc.tech.coop/blog/070520.html
http://bc.tech.coop/blog/070601.html
这或许可以解释的想法,并给出了Erlang的代码。

Erlang是开源的,所以你可以做一些小实验。并发性和通信内置于语言中,并且它在一台机器上“开箱即用”。您需要设置一个“密钥”以便Erlang虚拟机可以通信,但一旦完成,程序就可以在局域网上运行。

1

由于奥利调查包括你的语言的MapReduce解决方案是一件好事。具体的做法取决于你在理论和技术方面的问题。

以下是一些您可能会考虑回答的问题:您是否有分布式算法(无中心节点)?我们可以使用中心节点来同步计算吗(例如在数据库中)?批处理时间是否足够小以将文件io视为长时间?如果是,我们可以使用什么样的网络层?我们是否在一台计算机上运行,​​并且对IPC有一些需求?

+0

我认为现在我可以使用更简单的解决方案,因为我的程序执行时间远远超过文件I/O时间。因此,我可以将所有数据写入文件,然后通过文件处理合并数据。我不完全有一个分布式算法。它只是通过将作业提交给不同服务器而在多个输入数据集上运行的顺序算法。 – Richeek 2012-03-20 17:56:43

+0

这是一种分布式算法。如果你的代码不是多线程的,也许你可以考虑在每台计算机上运行你的程序的多个实例来使用所有可用的CPU。 – AsTeR 2012-03-20 18:16:42

+0

是的,这是我会做的......一旦所有的计算都在所有的CPU上完成,我将合并所有生成的文件:-) – Richeek 2012-03-20 18:59:27