JavaScript 内存不足错误:超出 UDF 线程内存限制-Snowflake

Posted

技术标签:

【中文标题】JavaScript 内存不足错误:超出 UDF 线程内存限制-Snowflake【英文标题】:JavaScript out of memory error: UDF thread memory limit exceeded-Snowflake 【发布时间】:2020-01-03 09:29:59 【问题描述】:

我正在尝试使用 javascript UDF 合并两个变体行。但是,我的每个变体行都有大约 12500 个键。 我的udf定义如下:

CREATE OR REPLACE FUNCTION merge_json(EXT_ROW VARIANT, STG_ROW VARIANT)
    RETURNS variant
    LANGUAGE JAVASCRIPT
    AS 
    $$
    function extend(ext, stg) 
      if(ext == null)ext=stg
      for (var key in stg) 
          if (stg.hasOwnProperty(key)) ext[key] = stg[key];
      
      return ext;
    
    return extend(EXT_ROW, STG_ROW)
    $$;

从雪花文档中,我知道如果脚本使用太多内存或运行到无限循环然后 udf 失败。所以我尝试在上面的函数中删除循环并使其如下:

 CREATE OR REPLACE FUNCTION merge_json_v1(EXT_ROW VARIANT, STG_ROW
 VARIANT)
     RETURNS variant
     LANGUAGE JAVASCRIPT
     AS 
     $$
     function extend(ext, stg) 
       if(ext == null)ext=stg
       let merged_row = Object.assign(ext, stg);
       return merged_row;
     
     return extend(EXT_ROW, STG_ROW)
     $$;

函数仍然抛出错误。有人可以帮我解决这个问题吗?

【问题讨论】:

【参考方案1】:

将 VARIANT 替换为 OBJECT 并消除内部包装函数可能会减少一些开销。

例如:

CREATE OR REPLACE FUNCTION merge_json_v1(EXT_ROW OBJECT, STG_ROW OBJECT)
RETURNS OBJECT
LANGUAGE JAVASCRIPT
AS 
$$
 return EXT_ROW ? Object.assign(EXT_ROW, STG_ROW) : STG_ROW
$$;

否则,您可以增加仓库大小。还要检查查询配置文件,以防其他原因导致问题。

【讨论】:

如果重写函数不能解决问题(尽管一定要试试这个),您可以联系 Snowflake 支持以获得更多帮助。

以上是关于JavaScript 内存不足错误:超出 UDF 线程内存限制-Snowflake的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse 堆空间(内存不足错误)

致命错误:使用任何“npm”命令时 JavaScript 堆内存不足

两个错误之一:内存不足或 Javascript 运行时意外退出

错误:接近堆限制的无效标记压缩分配失败 - JavaScript 堆内存不足

如何修复“致命错误:堆限制附近的无效标记压缩分配失败 - JavaScript 堆内存不足”错误

致命错误:堆限制附近的无效标记压缩分配失败 - JavaScript 堆内存不足 |反应