如何使用Java驱动程序从ArangoDB中的大量集合中快速读取数据
我正在评估ArangoDB(版本3.2.4)作为MongoDB的替代品。我们有一个包含270000份文件的庞大收藏。明年,此收集将增加(近4.000.000份文档) 如果我想使用Java驱动程序(版本4.2)从该集合中读取数据,则游标获取该数据需要花费大量时间。时间取决于所获取文档的大小,也就是说,如果我想获取所有文档,光标大约需要10分钟才能获取数据: AQL:如何使用Java驱动程序从ArangoDB中的大量集合中快速读取数据,arangodb,Arangodb,我正在评估ArangoDB(版本3.2.4)作为MongoDB的替代品。我们有一个包含270000份文件的庞大收藏。明年,此收集将增加(近4.000.000份文档) 如果我想使用Java驱动程序(版本4.2)从该集合中读取数据,则游标获取该数据需要花费大量时间。时间取决于所获取文档的大小,也就是说,如果我想获取所有文档,光标大约需要10分钟才能获取数据: AQL: for doc in myHugeCollection RETURN { "name": doc.name } A
for doc in myHugeCollection
RETURN { "name": doc.name }
AqlQueryOptions aqlQueryOptions = new AqlQueryOptions();
aqlQueryOptions.batchSize(500);
aqlQueryOptions.count(false);
aqlQueryOptions.cache(true);
ArangoCursor<MyHugeCollection> arangoCursor = arangoDatabase.query(
aqlQuery,
new HashMap<>(),
aqlQueryOptions,
MyHugeCollection.class);
for doc in myHugeCollection
limit 500
RETURN { "name": doc.name }
Java代码:
for doc in myHugeCollection
RETURN { "name": doc.name }
AqlQueryOptions aqlQueryOptions = new AqlQueryOptions();
aqlQueryOptions.batchSize(500);
aqlQueryOptions.count(false);
aqlQueryOptions.cache(true);
ArangoCursor<MyHugeCollection> arangoCursor = arangoDatabase.query(
aqlQuery,
new HashMap<>(),
aqlQueryOptions,
MyHugeCollection.class);
for doc in myHugeCollection
limit 500
RETURN { "name": doc.name }
此查询大约需要20毫秒
所以,我的问题是我做错了什么?如何在不等待光标数分钟的情况下访问大型集合中的数据?似乎需要一些异步发票,这样代码就不会等待返回整个数据集,而是可以在返回一些初始数据后开始工作。 您尝试过Java异步驱动程序()吗?我认为一旦Arango获得第一个结果集,你应该能够开始做一些工作。。。 请尝试在异步驱动程序手册中查找此部分:
db.query(query, bindVars, null, MyObject.class).thenAccept(cursor -> {
cursor.forEachRemaining(obj -> {
System.out.println(obj.getName());
});
});
另一个提示是尝试Java驱动程序提供的VelocyPack对象。但我不确定它们是否像您的用例可能需要的那样是异步的。这取决于您如何访问光标 将其转换为
List
时,将获取结果的每个文档
List<MyHugeCollection> asList = arangoCursor.asListRemaining();
或
您好,我已经试过了,但它对显示第一个结果的性能没有影响。谢谢您的回答,但这正是我当前获取文档的方式。问题是,在执行查询之后,大约需要10分钟才能到达for循环。好的,那么10分钟听起来太长了。你的设置看起来怎么样?单服务器还是群集?多少公羊?哪个存储引擎:mmfiles还是rocksdb?