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的主要内容,如果未能解决你的问题,请参考以下文章
致命错误:使用任何“npm”命令时 JavaScript 堆内存不足
两个错误之一:内存不足或 Javascript 运行时意外退出
错误:接近堆限制的无效标记压缩分配失败 - JavaScript 堆内存不足