【问题标题】:How can I read quickly data from a huge collection in ArangoDB using Java driver如何使用 Java 驱动程序从 ArangoDB 中的大量集合中快速读取数据
【发布时间】:2017-10-16 15:20:39
【问题描述】:

我正在评估 ArangoDB(版本 3.2.4)作为 MongoDB 的替代品。我们有一个包含 2.700.000 个文档的庞大集合。明年这个集合将增加(近 4.000.000 个文档)。

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

AQL:

for doc in myHugeCollection
    RETURN { "name": doc.name }

Java 代码:

    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 个文档:

for doc in myHugeCollection
    limit 500
    RETURN { "name": doc.name }

此查询大约需要 20 毫秒。

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

【问题讨论】:

    标签: arangodb


    【解决方案1】:

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

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

    List<MyHugeCollection> asList = arangoCursor.asListRemaining();
    

    当您使用 next()forEachRemaining()(需要 Java 8)对其进行迭代时,您可以在从数据库中获取下一批文档之前处理前 500 个文档。

    for (; arangoCursor.hasNext();) {
      MyHugeCollection doc = arangoCursor.next();
      // TODO
    }
    

    arangoCursor.forEachRemaining(doc -> {
      // TODO
    });
    

    【讨论】:

    • 感谢您的回答,但这正是我目前获取文件的方式。问题是,执行查询后,大约需要 10 分钟才能到达 for 循环。
    • 好的,那么 10 分钟听起来太长了。你的设置如何?单服务器还是集群?多少内存?哪个存储引擎:mmfiles 还是rocksdb?
    【解决方案2】:

    似乎您需要一些异步调用,以便您的代码不会等待返回整个数据集,而是可以在返回一些初始数据后开始工作。 您是否尝试过 Java 异步驱动程序 (https://github.com/arangodb/arangodb-java-driver-async)?我认为您应该能够在 Arango 获得第一个结果集后立即开始做一些工作...... 尝试在异步驱动手册中查找这部分:

        db.query(query, bindVars, null, MyObject.class).thenAccept(cursor -> {
         cursor.forEachRemaining(obj -> {
           System.out.println(obj.getName());
         });
       });
    

    另一个提示是尝试 Java Driver 提供的 VelocyPack 对象。但我不确定它们是否按照您的用例可能需要异步。

    【讨论】:

    • 您好,我已经尝试过了,但它对显示第一个结果的性能没有影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    相关资源
    最近更新 更多