Foxx arangodb遇到内存限制

问题描述 投票:0回答:1

我有一个简单的查询在foxx内部运行

For u in collection
Filter u.someIndexedSparseFiler !=null
Return {_id:u._id}

这将返回数以百万计的结果。在日志中,arago收到一条消息,指出已达到有限的内存堆并终止该过程。

reached heap-size limit of #3 interrupting V8 execution (heap size limit 3232954528, used 3060226424) during V8 internal collection

即使我在启动时添加了标志-javascript.v8-max-heap 3000。它仍然以相同的错误运行。我该怎么办?有没有比这更好的方法

arangodb aql foxx
1个回答
0
投票

我不确定为什么会出现内存不足错误,但是看起来您返回的数据溢出了V8堆大小。另一种可能性是,某种原因导致引擎丢失/忽略了索引,导致引擎在评估someIndexedSparseFiler属性之前加载了每个文档。

评估数百万个文档(或大量大型文档)不仅会花费大量磁盘/内存I / O,而且可能还需要大量RAM。尝试使用explain功能返回查询分析-它应该告诉您出了什么问题。

为了进行比较,我的查询...

FOR u IN myCollection
    FILTER u.someIndexedSparseFiler != null
    RETURN u._id

...当我单击“解释”时返回此:

Query String (82 chars, cacheable: true):
 FOR u IN myCollection
     FILTER u.someIndexedSparseFiler != null
     RETURN u._id

Execution plan:
 Id   NodeType          Est.   Comment
  1   SingletonNode        1   * ROOT
  7   IndexNode            5     - FOR u IN myCollection   /* persistent index scan, projections: `_id` */    
  5   CalculationNode      5       - LET #3 = u.`_id`   /* attribute expression */   /* collections used: u : myCollection */
  6   ReturnNode           5       - RETURN #3

Indexes used:
 By   Name                      Type         Collection     Unique   Sparse   Selectivity   Fields                         Ranges
  7   idx_1667363882689101824   persistent   myCollection   false    true        100.00 %   [ `someIndexedSparseFiler` ]   *

Optimization rules applied:
 Id   RuleName
  1   move-calculations-up
  2   move-filters-up
  3   move-calculations-up-2
  4   move-filters-up-2
  5   use-indexes
  6   remove-filter-covered-by-index
  7   remove-unnecessary-calculations-2
  8   reduce-extraction-to-projection

注意,它在Indexes used:下列出了我的稀疏索引。另外,尝试将!=更改为==,您会发现它现在忽略了索引!这是因为优化器知道稀疏索引永远不会具有null值,因此它会跳过它。

如果您不熟悉它,那么在调整查询和创建索引时,“解释”功能将非常有用(实际上是必不可少的)。另外,请记住索引应与您的查询相匹配;在这种情况下,索引应仅具有一个属性,否则“选择性”商可能太低,引擎将忽略它。

© www.soinside.com 2019 - 2024. All rights reserved.