我使用Datastax驱动程序从Cassandra获取大量行,并且需要尽快处理它们。使用具有Java 8并行数据流的Datastax Cassandra ResultSet - 快速地
我已经调查使用List::parallelStream().forEach()
这似乎很大,首先因为ResultSet
行为很像0,但遗憾的是我不能直接在ResultSet
使用parallelStream()
。为了得到这个工作,我首先必须使用ResultSet::all()
这真的很慢 - 我假设它遍历每个元素。
ResultSet rs = this.getResultSet(); // Takes <1 second
// Convert the ResultSet to a list so as I can use parallelStream().
List<Row> rsList = rs.all(); // Takes 21 seconds
rsList.parallelStream().forEach(this::processRow); // Takes 3 seconds
有没有更快的方法可以处理结果集的每一行?
出于好奇,多少时间RLIST的顺序处理走?看看你的时间数字,你的瓶颈不是行的处理,而是他们的检索。所以平行化行处理会给你一个相当小的改进。对我来说,你似乎应该考虑优化你的查询/架构/集群设置/网络。 – Ralf
我来自一个PHP背景,所以我习惯于调用execute()后包含行的结果集。这不是这种情况吗? –
独立于您使用问题的驱动程序是相同的:您通过驱动程序向C *提交查询; C *处理查询并计算结果集的行; C *将结果行发送给驱动程序(在@doanduyhai指出的页面中)。只要驱动程序使第一行可用,客户端就可以开始处理行('one()'返回第一行)。因此,您可以开始并行处理行,以便发送更多行,从而有效地并行处理流程。但总体而言,您的速度永远不会比C *向您发送最后一行结果所花费的时间更快。 – Ralf