大家好,
我正在将一款文本挖掘/自然语言处理应用程序从单核转移到Map-Reduce风格的系统。其中一个步骤涉及到类似于以下内容的while循环:
Queue<Element>;
while (!queue.empty()) {
Element e = queue.next();
Set<Element> result = calculateResultSet(e);
if (!result.empty()) {
queue.addAll(result);
}
}
每次迭代都依赖于之前的结果(有点儿这个意思)。无法确定此循环将执行多少次迭代。
像这样的串行算法有没有并行化的方法?我正在尝试想出一种反馈机制,能够提供自己的输入,但如何将其并行化呢?
谢谢任何帮助/评论。
[a,b,c]
为初始列表,a
将评估[b,c]
,b
将评估[b,c,d,e]
(例如)等等?calculateResultSet
可以使用不完整的数据开始处理吗(即,它可以处理队列直到下一个部分准备好)?我不确定它如何适应 MapReduce 范例,但似乎(也许)所有初始元素都可以开始处理其部分列表,直到a
完成,然后处理a
直到b
完成,依此类推。 - Edvard PedersencalculateResultSet()
需要整个集合准备就绪,因此没有办法从半成品集合开始。我需要的是一种将输入附加到 Map 操作的方法,但我不认为这是可能的。 - theintzcalculateResultSet
吗?如果不能,并且第 N 次调用calculateResultSet
需要完整的前 N-1 次调用的结果才能开始处理,那么你只能使用串行执行。如果你可以修改calculateResultSet
,你可以并行化它,或者处理数据直到可用队列的末尾并等待,在前面的执行产生数据时处理数据,并且只有在所有前 N-1 个输出被处理后才返回结果。 - Edvard Pedersenb
部分能够在a
完成之前处理c
,因此如果a
能够在b
处理c
之前修改c
,那么可能某种形式的推测执行可以起作用,但是不知道calculateResultSet
实际上做了什么很难说。 - Edvard Pedersen