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

Arangodb 如何使边唯一并量化它们而不出现内存不足错误,arangodb,Arangodb,我创建了一个边缘集合,大约有1600万条边缘。边不唯一,表示从顶点a到顶点b有多条边。边缘集合大小约为2.4 GB数据,边缘索引大小为1.6 GB。我使用的是一台16GB内存(另外还有16BG交换空间)的计算机 现在,我尝试使用如下语句计算唯一边(在每个顶点a-b对之间): FOR wf IN DeWritesWith COLLECT from = wf._from, to = wf._to WITH COUNT INTO res INSERT { "_from"

我创建了一个边缘集合,大约有1600万条边缘。边不唯一,表示从顶点a到顶点b有多条边。边缘集合大小约为2.4 GB数据,边缘索引大小为1.6 GB。我使用的是一台16GB内存(另外还有16BG交换空间)的计算机

现在,我尝试使用如下语句计算唯一边(在每个顶点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 }
我的问题是:我总是用光内存(32GB RAM)。由于当我不想写入结果时也会出现问题,因此我假设这不是一个写入大量事务日志的问题。
这正常吗?我能以某种方式优化AQL吗?我希望有一个解决方案,因为我认为这个场景在图形中是一个更通用的使用场景…

自ArangoDB 2.6以来,
收集可以在两种模式下运行:

  • 聚合前使用排序步骤的排序模式
  • 不需要预先排序步骤的哈希表模式
如果认为哈希表模式比排序步骤中的排序模式便宜,优化器将自动选择哈希表模式

2.6中新的
COLLECT
实现应该使查询的选择部分在2.6中的运行速度比在2.5及之前的版本快得多。请注意,
COLLECT
即使使用哈希表模式,仍然会生成其结果的排序输出(而不是其输入)。这样做是为了与排序模式兼容。通过在
COLLECT
语句之后添加额外的
sort null
指令,可以避免此结果排序步骤。然后优化器可以优化结果的排序

下面是一篇解释这两种模式的博客文章:

我们目前正在寻找优化
收集的方法。当前,
COLLECT
非常昂贵,因为在上述情况下,它将对集合进行完全排序(在
\u from
\u to
上没有排序索引,只有未排序的边索引)。也许在某些情况下可以优化排序,这就是我们目前正在调查的。如果有进展,我会在这里报告。听起来不错。这符合我最近的测试,我将_从,_到复制到其他属性中,对其进行分割索引,然后计算它。。。花了60秒。这是非常好的性能,特别是与10分钟后的mem out相比:-)是的,通过使用索引消除排序步骤肯定会使查询运行得更快。我已经原型化了另一个版本的
COLLECT
,它不需要排序输入,并且在内部使用哈希表。到目前为止,它看起来很有希望,但还没有准备好。