我正在评估ArangoDB (3.2.4版)作为MongoDB的替代品。我们有一个包含2.700.000份文件的庞大藏书。明年,这一收集量将增加(近4.000.000份文件)。
如果我想使用Java驱动程序(Version4.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毫秒。
所以,我的问题是我做错了什么?如何在不等待几分钟游标的情况下访问大型集合中的数据?
发布于 2017-10-17 06:48:26
这取决于您如何访问游标。
当您将其转换为List时,将获取结果的每个文档。
List<MyHugeCollection> asList = arangoCursor.asListRemaining();当您使用next()或forEachRemaining() (正则Java8)迭代它时,您可以在从数据库中获取下一批之前处理前500个文档。
for (; arangoCursor.hasNext();) {
MyHugeCollection doc = arangoCursor.next();
// TODO
}或
arangoCursor.forEachRemaining(doc -> {
// TODO
});发布于 2017-10-17 00:23:19
似乎您需要一些异步协作,这样您的代码就不会等待整个数据集的返回,而是可以在返回一些初始数据之后开始工作。您试过Java异步驱动程序(https://github.com/arangodb/arangodb-java-driver-async)吗?我认为你应该能开始做一些工作,一旦阿兰戈得到第一个结果.尝试在异步驱动程序手册中查找此部分:
db.query(query, bindVars, null, MyObject.class).thenAccept(cursor -> {
cursor.forEachRemaining(obj -> {
System.out.println(obj.getName());
});
});另一个提示是尝试Java驱动程序提供的VelocyPack对象。但我不确定它们是否如用例所要求的那样是异步的。
https://stackoverflow.com/questions/46773677
复制相似问题