【问题标题】:CosmosDB - Gremlin - high memory usagage with query containing limit() stepCosmosDB - Gremlin - 查询包含 limit() 步骤的高内存使用率
【发布时间】:2021-05-21 09:37:10
【问题描述】:

我想检索大量项目但使用限制子句:

g.V().hasLabel('foo').as('f').limit(5000).order().by('f_Id',incr).by('f_bar',incr).select('f').unfold().dedup()

这个查询需要很长时间,并且要消耗大约 800 MB 的内存来下载集合

我使用以下查询:

g.V().hasLabel('foo').as('f').has('propA','ValueA').has('propB','ABC').limit(5000).order().by('f_Id',incr).by('f_bar',incr).select('f').unfold().dedup()

下载这个集合更快,消耗更少的内存大约 500 MB,但仍然很高。

如果我不想按属性 A 和 B 进行过滤,我的问题是如何仅限制优化第一个查询。

第二个问题为什么这两个结果之间的内存大小有如此大的差异?在这两个查询中,我将 5000 个项目下载到内存中。有什么方法可以减少这种消耗。

我将 GremlinDriver 用于 .Net。

【问题讨论】:

  • 只是澄清一下,您是说您的数据是这样的,g.V().hasLabel('foo').has('propA','ValueA').has('propB','ABC').limit(5000) 本身会产生 5000 个结果吗?因此有 5000 个或更多带有标签“foo”的顶点以及“propA”和“propB”的值?
  • @stephenmallette 是的,这是正确的

标签: performance azure-cosmosdb gremlin gremlin-server


【解决方案1】:

我不是 CosmosDB 优化方面的专家,但从 Gremlin 的角度来看,当我查看此遍历时:

g.V().hasLabel('foo').as('f').
  limit(5000).order().by('f_Id',incr).by('f_bar',incr).
  select('f').unfold().dedup()

我想知道你为什么不把它写成:

g.V().hasLabel('foo').limit(5000).order().by('f_Id',incr).by('f_bar',incr)

意思是,你想要 5000 个“foo”顶点以某种方式排序。使用“f”步骤标签和unfold() 的需要似乎没有必要,我不明白你怎么会得到重复,所以你可以放弃dedup()。我不确定这些更改是否会对 CosmosDB 的处理方式产生任何影响,但它肯定会删除一些不需要的处理。

我还想知道您是否需要将顶点中返回的数据配对。现在,您正在返回每个顶点的所有属性。如果您不需要所有这些,最好更具体一些并将数据转换为您的应用程序所需的形式:

g.V().hasLabel('foo').limit(5000).order().by('f_Id',incr).by('f_bar',incr).
  valueMap('name','age')

这应该有助于降低序列化成本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多