我们在仅包含100,000个对象的imap上应用了很少的谓词来过滤数据。这些谓词将随每个用户而变化。在具有两个节点(每个节点显示50000)和100,000条记录的本地计算机(16 GB)上进行POC时,我在30秒内获得了输出,这比直接查询数据库还重要。
增加节点数会减少时间,我什至尝试使用PagingPredicate,但每页花费大约20秒
IMap objectMap = hazelcastInstance.getMap("myMap");
MultiMap resultMap = hazelcastInstance.getMap("myResultMap");
/*Option 1 : passing hazelcast predicate for imap.values*/
objectMap.values(predicate).parallelStream().forEach(entry -> resultMap(userId, entry));
/*Option 2: applying java predicate to entrySet OR localkeyset*/
objectMap.entrySet.parallelstream().filter(predicate).forEach(entry -> resultMap(userId, entry));
答案 0 :(得分:1)
更多节点会有所帮助,但这种改进很难量化。它可能很大,也可能很小。
代码示例中的部分工作涉及对100,000个条目应用谓词。如果没有索引,那么扫描阶段将在每个节点检查50,000个条目(如果有2个节点)。将最多4个节点加倍,每个节点有25,000个条目要扫描,因此扫描时间将减少一半。
扫描时间是查询时间的一部分,整个结果集也必须由每个节点的部分结果组成。因此,在最佳情况下,将节点数量加倍可能会接近运行时间的一半,或者可能不是一个明显的改进。
也许更大的问题是您要达到什么目标?
代码示例中的 t(sapply(c("cyl", "disp", "wt"), function(x)
summary(lm(paste0("mpg ~ ", x), data = mtcars))$coefficients[-1, 1:2]))
将结果集检索到中心点,然后将其应用objectMap.values(predicate)
尝试将结果并行合并到MultiMap中。因此,这看起来更像是一个ETL,而不是查询。
按标题使用执行程序,类似parallelStream()
之类的东西可以使它更好地并行化,因为没有中间点可以保持中间结果。