我创建了一个边缘集合,边缘约为16 Mio。边不是唯一的,意味着从顶点a到顶点b有多个边。边缘集合大小约为2.4 GB数据,边缘索引大小为1.6 GB。我使用的是16 GB RAM的计算机(另外还有16个BG交换空间)。
现在我尝试用这样的语句计算唯一的边(在每对顶点a-b之间):
FOR wf IN DeWritesWith
COLLECT from = wf._from, to = wf._to WITH COUNT INTO res
INSERT { "_from": from, "_to": to, "type": "writesWith", "numArticles": res } INTO DeWritesWithAggregated
// Does also lead to out-of-memory error:
// RETURN { "_from": from, "_to": to, "type": "writesWith", "numArticles": res }
我的问题:我总是运行内存不足(32 GB RAM)。由于当我不想写结果时也会出现问题,我认为这不是大写事务日志的问题。 这是正常的,我能以某种方式优化AQL吗?我希望有一个解决方案,因为我认为这个场景是图表中更通用的使用场景......
答案 0 :(得分:1)
自ArangoDB 2.6以来,COLLECT
可以在两种模式下运行:
如果通过排序步骤认为它比排序模式更便宜,优化器将自动选择哈希表模式。
2.6中的新COLLECT
实现应该使查询的选择部分在2.6中比在2.5及之前运行得快得多。请注意,即使使用哈希表模式,COLLECT
仍会生成结果(而非其输入)的排序输出。这样做是为了与排序模式兼容。通过在SORT null
语句后添加额外的COLLECT
指令,可以避免此结果排序步骤。然后,优化器可以优化结果的排序。
解释这两种模式的博客文章如下: http://jsteemann.github.io/blog/2015/04/22/collecting-with-a-hash-table/