0

コード付き:

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 は 1 つのノード (ランダムに見える) を選択し、そのノードでのみ各「処理ルール」を処理します。

私がやりたいのは、forEach並列にすることです。理想的には、3 つのノードと 30 のエントリの場合、各ノードは 10 のエントリを処理する必要があります。キャッシュはpartitioned、各ノードが独自のエントリを持つようになっています。

4

1 に答える 1

1

コードでは、grid.compute().apply(...)try を使用する代わりに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();
于 2014-07-06T02:34:40.123 に答える