首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Java驱动程序从ArangoDB中的大型集合中快速读取数据

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

Stack Overflow用户
提问于 2017-10-16 15:20:39
回答 2查看 1K关注 0票数 2

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

如果我想使用Java驱动程序(Version4.2)从该集合中读取数据,那么游标获取该数据需要花费大量时间。时间取决于获取文档的大小,这意味着,如果要获取所有文档,游标要花费大约10分钟的时间来获取数据:

AQL:

代码语言:javascript
复制
for doc in myHugeCollection
    RETURN { "name": doc.name }

Java代码:

代码语言:javascript
复制
    AqlQueryOptions aqlQueryOptions = new AqlQueryOptions();
    aqlQueryOptions.batchSize(500);
    aqlQueryOptions.count(false);
    aqlQueryOptions.cache(true);

    ArangoCursor<MyHugeCollection> arangoCursor = arangoDatabase.query(
            aqlQuery,
            new HashMap<>(),
            aqlQueryOptions,
            MyHugeCollection.class);

这将需要大约10分钟,直到我能够访问数据通过光标。由于我将批处理大小设置为500,所以我的期望是快速响应,因为获取前500个结果是非常快的。

修改的AQL获取前500个文档:

代码语言:javascript
复制
for doc in myHugeCollection
    limit 500
    RETURN { "name": doc.name }

这个查询将花费大约20毫秒。

所以,我的问题是我做错了什么?如何在不等待几分钟游标的情况下访问大型集合中的数据?

EN

回答 2

Stack Overflow用户

发布于 2017-10-17 06:48:26

这取决于您如何访问游标。

当您将其转换为List时,将获取结果的每个文档。

代码语言:javascript
复制
List<MyHugeCollection> asList = arangoCursor.asListRemaining();

当您使用next()forEachRemaining() (正则Java8)迭代它时,您可以在从数据库中获取下一批之前处理前500个文档。

代码语言:javascript
复制
for (; arangoCursor.hasNext();) {
  MyHugeCollection doc = arangoCursor.next();
  // TODO
}

代码语言:javascript
复制
arangoCursor.forEachRemaining(doc -> {
  // TODO
});
票数 1
EN

Stack Overflow用户

发布于 2017-10-17 00:23:19

似乎您需要一些异步协作,这样您的代码就不会等待整个数据集的返回,而是可以在返回一些初始数据之后开始工作。您试过Java异步驱动程序(https://github.com/arangodb/arangodb-java-driver-async)吗?我认为你应该能开始做一些工作,一旦阿兰戈得到第一个结果.尝试在异步驱动程序手册中查找此部分:

代码语言:javascript
复制
    db.query(query, bindVars, null, MyObject.class).thenAccept(cursor -> {
     cursor.forEachRemaining(obj -> {
       System.out.println(obj.getName());
     });
   });

另一个提示是尝试Java驱动程序提供的VelocyPack对象。但我不确定它们是否如用例所要求的那样是异步的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46773677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档