我刚接触Hazelcast,我正试着用它在一张地图中存储数据,这张地图太大了,一台机器无法容纳它。
我需要实现的过程之一是遍历映射中的每个值,并对它们执行某些操作-而不是累加或聚合,并且我不需要一次查看所有数据,因此不需要考虑内存问题。
我的简单实现是使用IMap.keySet(),然后迭代所有键,依次获得每个存储值(并允许值在处理后为GCed ),但我担心的是,系统中将有如此多的数据,以至于即使只是获得键的列表也会足够大,从而给系统带来不必要的压力。
我希望有一个流式API,我可以以这样的方式流式传输关键字(甚至完整的条目),这样本地节点就不必在本地缓存整个集合-但在文档中找不到任何与我相关的内容。
如果您能提出任何建议,我将不胜感激。谢谢。
发布于 2017-02-15 21:39:13
Hazelcast Jet提供了分布式版本的j.u.s,并为IMap添加了«streaming»功能。它允许在Hazelcast群集上执行Java Streams API。
import com.hazelcast.jet.JetInstance;
import com.hazelcast.jet.stream.DistributedCollectors;
import com.hazelcast.jet.stream.IStreamMap;
import com.hazelcast.jet.stream.IStreamList;
import static com.hazelcast.jet.stream.DistributedCollectors.toIList;
final IStreamMap<String, Integer> streamMap = instance1.getMap("source");
// stream of entries, you can grab keys from it
IStreamList<String> counts = streamMap.stream()
.map(entry -> entry.getKey().toLowerCase())
.filter(key -> key.length() >= 5)
.sorted()
// this will store the result on cluster as well
// so there is no data movement between client and cluster
.collect(toIList());请查找有关jet here和更多示例here的更多信息。
干杯,维克
发布于 2017-03-09 16:52:51
虽然Hazelcast Jet stream的实现看起来令人印象深刻,但我没有太多时间考虑升级到Hazelcast Jet (在我们几乎是沼泽标准的vert.x设置中)。取而代之的是,我使用了IMap.executeOnEntries,它似乎和@Vik Gamov为Hazelcast Jet所做的细节是一样的,只是语法更烦人。
我的例子:
myMap.executeOnEntries(new EntryProcessor<String,MyEntity>(){
private static final long serialVersionUID = 1L;
@Override
public Object process(Entry<String, MyEntity> entry) {
entry.getValue().fondle();
return null;
}
@Override
public EntryBackupProcessor<String, MyEntity> getBackupProcessor() {
return null;
}});如您所见,语法非常烦人:
https://stackoverflow.com/questions/42227680
复制相似问题