我是Hazelcast的新手,我试图用它来存储数据,这个数据太大而不适合放在一台机器上。
我需要实现的一个过程是遍历地图中的每个值并对它们执行某些操作 - 不累积或聚合,我不需要一次查看所有数据,所以没有记忆问题。
我的琐碎实现是使用IMap.keySet()
,然后遍历所有键以依次获取每个存储的值(并允许在处理后将值设置为GC),但我担心的是系统中的数据如此之多,即使只获得密钥列表也会大到足以给系统带来不必要的压力。
我希望有一个流API,我可以流式传输密钥(甚至是完整的条目),本地节点不必在本地缓存整个集合 - 但是找不到任何与之相关的内容我在文档中。
我很感激您提出的任何建议。感谢。
答案 0 :(得分:1)
Hazelcast Jet提供j.u.s
的分布式版本,并为IMap
增加了“流媒体”功能。
它允许在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());
干杯, 维克
答案 1 :(得分:0)
虽然Hazelcast Jet流的实现看起来令人印象深刻,但我还没有多少时间投资于升级到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;
}});
正如您所看到的,语法非常烦人: