簡體   English   中英

CosmosDB - Gremlin - 高 memory 使用率,查詢包含 limit() 步驟

[英]CosmosDB - Gremlin - high memory usagage with query containing limit() step

我想檢索大量項目但使用限制子句:

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

此查詢需要很長時間,大約消耗 800 MB memory 來下載集合

當我使用以下查詢時:

gV().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()

它更快,消耗更少的 memory 大約 500 MB 來下載這個集合,但仍然很高。

如果我不想按屬性 A 和 B 過濾,我的問題是如何僅限制優化第一個查詢。

第二個問題為什么這兩個結果之間的 memory 大小存在如此差異? 在這兩個查詢中,我將 5000 個項目下載到 memory。 有什么可能的方法來減少這種消耗。

我使用 GremlinDriver for.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).by('f_bar',incr)

意思是,您希望以某種方式排序 5000 個“foo”頂點。 使用“f”步驟 label 和unfold()似乎沒有必要,我不明白你怎么會得到重復,所以你可以刪除dedup() 我不確定這些更改是否會對 CosmosDB 處理事物的方式產生任何影響,但它肯定會刪除一些不需要的處理。

我還想知道您是否需要將頂點中返回的數據配對。 現在,您正在返回每個頂點的所有屬性。 如果您不需要所有這些,那么更具體並將數據轉換為您的應用程序所需的形式可能會更好:

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

這應該有助於降低序列化成本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM