【发布时间】:2012-05-02 15:11:05
【问题描述】:
大家好,
我正在将文本挖掘/自然语言应用程序从单核移植到 Map-Reduce 样式系统。其中一个步骤涉及类似于以下的 while 循环:
Queue<Element>;
while (!queue.empty()) {
Element e = queue.next();
Set<Element> result = calculateResultSet(e);
if (!result.empty()) {
queue.addAll(result);
}
}
每次迭代都取决于前一次的结果(种类)。无法确定此循环必须执行的迭代次数。
有没有一种方法可以并行化像这样的串行算法?我正在尝试考虑一种反馈机制,它能够提供自己的输入,但是如何将它并行化?
感谢任何帮助/评论
【问题讨论】:
-
有什么理由不能只根据原始队列对工作进行分区吗?例如。排序很重要,原始队列是否很短,最短和最长运行时间之间会有很大差异吗?
-
Edvard,函数calculateResultSet()看的是整个输入集,在这一步开始之前需要完全计算。
-
那么,按字母顺序添加元素,初始列表为
[a,b,c],a将评估[b,c],b将评估[b,c,d,e](例如)等?calculateResultSet可以开始处理不完整的数据(即它可以处理队列直到下一部分准备好)?我不确定它如何适合 MapReduce 范式,但似乎(也许)所有初始元素都可以开始处理它们的部分列表直到a完成,然后处理a直到b完成等等. -
就我目前所了解的应用程序而言,
calculateResultSet()需要准备好整个系列,因此实际上没有办法从半成品系列开始。我需要的是一种附加到地图操作输入的方法,但我不相信这是可能的。 -
可以修改
calculateResultSet吗?如果您不能,并且对calculateResultSet的第 N 次调用需要 N-1 次先前调用的完整结果才能开始处理,那么您将陷入串行执行的困境。如果您可以修改calculateResultSet,您可以将其并行化,或处理数据直到可用队列结束并等待,处理先前执行产生的数据,并且仅在处理所有 N-1 个先前输出时才返回结果.
标签: algorithm mapreduce parallel-processing distributed-computing text-mining