try (Grid grid = GridGain.start(AnswerYagoFactTests.class.getResource("yago.gridgain.xml"))) {
GridCache<Integer, YagoRule> cache = grid.cache("yagoRules");
grid.compute().broadcast(new Runnable() {
@Override
public void run() {
try {
log.info("Cache formerly has size={} offheap={} overflow={}",
cache.size(), cache.offHeapEntriesCount(), cache.overflowSize());
} catch (GridException e) {
log.error("Cannot get overflow size", e);
}
}
}).get();
log.info("1 is {}", cache.get(1));
grid.compute().apply(new GridClosure<String, String>() {
@Override
public String apply(String e) {
log.info("Found {} YAGO rules", cache.size());
cache.forEach(new GridInClosure<GridCacheEntry<Integer,YagoRule>>() {
@Override
public void apply(GridCacheEntry<Integer, YagoRule> e) {
log.info("Processing rule #{} {}", e.getKey(), e.getValue());
}
});
return null;
}
}, msg).get();
}
在3节点配置中。 GridGain选择一个节点(似乎是随机的),然后仅处理该节点中的每个“处理规则”。
我想做的是使forEach
并行,理想情况下,对于3个节点和30个条目,每个节点应处理10个条目。缓存为partitioned
,因此每个节点都有自己的条目。
答案 0 :(得分:1)
在您的代码中,而不是grid.compute().apply(...)
尝试使用grid.compute().broadcast(...)
,闭包将广播到网格中的所有节点。
此外,如果您只需要通过主要集(不包括备份)进行迭代,您可以按以下方式进行迭代:
grid.compute().broadcast(new GridClosure<String, Integer>() {
@Override public String apply(String e) {
for (GridCacheEntry<Integer, YagoRule> e : cache.primaryEntrySet()
log.info("Processing rule #{} {}", e.getKey(), e.getValue());
}
}, msg).get();