我有一个概念性的问题。
假设我有一个过程(任何语言),它将数据集作为输入,处理它并将输出写入数组。该数组在流中用于进一步处理。问题是代码运行时间很长。如此之大以至于需要进行优化!
我建议将输入数据集划分为更小的块,并并行调用每个数据集的过程。听起来很简单!
因此我想在单独的文件中编写该过程,创建一个单独的可执行文件。为较小的数据集提交此可执行文件以进行批处理。
但是这个方法的问题在于,由于每个批处理作业都是一个单独的进程,如何创建我之前从所有这些作业创建的数组!我可以考虑将每个作业输出写入文件,然后处理它们以创建数组。
有没有更好的方法同时做事?
感谢您的建议:)
答案 0 :(得分:1)
正如Oli所说,研究适用于您的语言的MapReduce解决方案是一件好事。具体的做法真正取决于你在理论和技术方面的问题。
以下是您可能会考虑回答的一些问题:您是否有分布式算法(没有中心节点)?我们可以使用中心节点来同步计算(例如在数据库中)吗?批处理时间是否足够小,可以将文件io视为长时间?如果是,我们可以使用哪种网络层?我们是在一台计算机上运行并且对IPC有一些需求吗?
答案 1 :(得分:1)
我同意它看起来像MapReduce。
您可能希望了解Erlang,它支持跨流程,处理器和计算机分区和分配工作的非常优雅的方式。
Joe Armstrong的Erlang书“编程Erlang - 并发世界的软件”提供了一个简单的MapReduce,可以跨进程使用。
我发现这些博客谈论了Joe的简单MapReduce:
http://bc.tech.coop/blog/070520.html
http://bc.tech.coop/blog/070601.html
这可能解释了这个想法,并给出了Erlang代码。
Erlang是开源的,因此您可以及时进行一些小额投资的实验。 并发和通信都内置在语言中,并且它在一台机器上“开箱即用”。您需要设置一个“密钥”,以便Erlang虚拟机可以进行通信,但一旦完成,就可以在局域网上运行程序。