我正在尝试优化查询的扫描时间。该查询是一个没有过滤器的简单范围查询。当我运行查询时,通常需要大约10秒来对未加盐的时间序列数据执行扫描(大约180万行,每行包含32个字节值和40个字节键)。
如果我对数据进行加盐,那么我是否期望加速?然后并行运行扫描?
例如,我可以随机附加每行0,1,2,3,4,5。然后我可以有一个大小为6的线程池来并行执行6次单独的扫描。当我目前这样做时,我没有看到任何加速,这导致相信可能在幕后发生的事情会使并行扫描的任何好处无效。
关于此的文档非常少,因此非常感谢任何指导。
答案 0 :(得分:0)
在检查了我的假设之后,我意识到我使用的VM只有两个VCPU。我将其增加到SALT_RANGE并获得预期的加速。所以基本上,确保CPU的数量可以处理负载。下面是缩写的Java代码(我正在处理我的数据的地图),用于并行运行扫描。
ForkJoinPool myPool = new ForkJoinPool(Config.SALT_RANGE);
results = myPool.submit(() ->
IntStream.range(0,Config.SALT_RANGE).parallel().mapToObj(salt -> {
Scan scan = buildMyScan();
Table t = agent.getTableMain();
out = performScan(scan);
return out;
}).map(Map::entrySet).flatMap(Collection::stream).collect(
Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (a, b) -> merger(a, b), TreeMap::new)))
.get();