如何使边缘唯一并量化它们而不会出现内存不足错误

时间:2015-04-02 10:52:20

标签: arangodb

我创建了一个边缘集合,边缘约为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吗?我希望有一个解决方案,因为我认为这个场景是图表中更通用的使用场景......

1 个答案:

答案 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/