如何使用Java驱动程序从ArangoDB中的大量集合中快速读取数据

如何使用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

我正在评估ArangoDB(版本3.2.4)作为MongoDB的替代品。我们有一个包含270000份文件的庞大收藏。明年,此收集将增加(近4.000.000份文档)

如果我想使用Java驱动程序(版本4.2)从该集合中读取数据,则游标获取该数据需要花费大量时间。时间取决于所获取文档的大小,也就是说,如果我想获取所有文档,光标大约需要10分钟才能获取数据:

AQL:

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?