如何解决CosmosDB - Gremlin - 查询包含 limit() 步骤的高内存使用率
我想检索大量项目,但使用限制子句:
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).select('f').unfold().dedup()
下载此集合速度更快,消耗的内存更少,大约 500 MB,但仍然很高。
我的问题是如果我不想按属性 A 和 B 过滤,如何只用限制优化第一个查询。
第二个问题,为什么这两个结果之间的内存大小有如此大的差异?在这两个查询中,我将 5000 个项目下载到内存中。有什么可能的方法可以减少这种消耗。
我将 GremlinDriver 用于 .Net。
解决方法
我不是 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)
意思是,你想要 5000 个“foo”顶点以某种方式排序。需要使用“f”步骤标签和 unfold()
似乎没有必要,而且我不明白您最终如何得到重复项,因此您可以删除 dedup()
。我不确定这些更改是否会对 CosmosDB 处理事物的方式产生任何影响,但它肯定会删除一些不需要的处理。
我还想知道您是否需要将顶点中返回的数据配对。现在您正在返回每个顶点的所有属性。如果您不需要所有这些,最好更具体并将数据转换为您的应用程序所需的形式:
g.V().hasLabel('foo').limit(5000).order().by('f_Id',incr).
valueMap('name','age')
这应该有助于降低序列化成本。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。