gpt4 book ai didi

运行 js 脚本以每分钟从 api 获取数据时 Javascript 堆内存不足 - javascript/node.js

转载 作者:行者123 更新时间:2023-12-03 22:20:31 24 4
gpt4 key购买 nike

我的程序从 API 中抓取约 70 页的 1000 个项目,并使用 Sequelize 将其批量插入到 SQLite 数据库中。循环几次后,node 的内存使用量上升到 1.2GB 左右,然后最终导致程序崩溃并出现以下错误:FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory .我试过使用 delete对于我用于响应 API 调用的所有大变量以及 variable = undefined 的内容然后 global.gc() ,但是我仍然会使用大量内存并最终崩溃。增加 Node.js 的内存上限会有所帮助吗?或者它的内存使用量会一直增加,直到达到下一个上限?
这是错误的完整输出:


<--- Last few GCs --->

[6760:0x128008000] 436085 ms: Scavenge 4068.7 (4110.5) -> 4068.7 (4110.5) MB, 2.7 / 0.0 ms (average mu = 0.918, current mu = 0.875) allocation failure
[6760:0x128008000] 436345 ms: Scavenge 4073.0 (4113.8) -> 4072.9 (4118.8) MB, 9.2 / 0.0 ms (average mu = 0.918, current mu = 0.875) allocation failure
[6760:0x128008000] 436565 ms: Scavenge (reduce) 4079.1 (4122.1) -> 4079.3 (4121.9) MB, 4.6 / 0.0 ms (average mu = 0.918, current mu = 0.875) allocation failure


<--- JS stacktrace --->


<--- Last few GCs --->

[6760:0x128008000] 436085 ms: Scavenge 4068.7 (4110.5) -> 4068.7 (4110.5) MB, 2.7 / 0.0 ms (average mu = 0.918, current mu = 0.875) allocation failure
[6760:0x128008000] 436345 ms: Scavenge 4073.0 (4113.8) -> 4072.9 (4118.8) MB, 9.2 / 0.0 ms (average mu = 0.918, current mu = 0.875) allocation failure
[6760:0x128008000] 436565 ms: Scavenge (reduce) 4079.1 (4122.1) -> 4079.3 (4121.9) MB, 4.6 / 0.0 ms (average mu = 0.918, current mu = 0.875) allocation failure


<--- JS stacktrace --->

FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory
FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory

<--- Last few GCs --->

[6760:0x128008000] 436085 ms: Scavenge 4068.7 (4110.5) -> 4068.7 (4110.5) MB, 2.7 / 0.0 ms (average mu = 0.918, current mu = 0.875) allocation failure
[6760:0x128008000] 436345 ms: Scavenge 4073.0 (4113.8) -> 4072.9 (4118.8) MB, 9.2 / 0.0 ms (average mu = 0.918, current mu = 0.875) allocation failure
[6760:0x128008000] 436565 ms: Scavenge (reduce) 4079.1 (4122.1) -> 4079.3 (4121.9) MB, 4.6 / 0.0 ms (average mu = 0.918, current mu = 0.875) allocation failure


<--- JS stacktrace --->

FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory

<--- Last few GCs --->

[6760:0x128008000] 436085 ms: Scavenge 4068.7 (4110.5) -> 4068.7 (4110.5) MB, 2.7 / 0.0 ms (average mu = 0.918, current mu = 0.875) allocation failure
[6760:0x128008000] 436345 ms: Scavenge 4073.0 (4113.8) -> 4072.9 (4118.8) MB, 9.2 / 0.0 ms (average mu = 0.918, current mu = 0.875) allocation failure
[6760:0x128008000] 436565 ms: Scavenge (reduce) 4079.1 (4122.1) -> 4079.3 (4121.9) MB, 4.6 / 0.0 ms (average mu = 0.918, current mu = 0.875) allocation failure


<--- JS stacktrace --->

FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory
zsh: segmentation fault npm start
我在具有 16GB 内存的 MacBook Air M1 上运行 Node v15.12.0,但是据我所知,我认为硬件不是这里的问题......有谁知道为什么会这样?提前致谢 :)
编辑:
结果我使用的 Node 模块之一从未从 api 调用中删除它的响应,所以我只是重写了我的代码的那部分,现在我可以开始了。

最佳答案

根据您提供的数据,无法判断您内存不足的原因。
也许工作集(即您需要同时保留的东西的数量)恰好大于您当前的堆限制;在这种情况下,增加限制会有所帮助。通过尝试很容易找到,例如与 --max-old-space-size=8000 (兆字节)。
也许某处存在内存泄漏,无论是在您自己的代码中,还是在您的某个第三方模块中。换句话说,也许您不小心使您不再需要的对象保持可访问性。
如果您提供复制案例,那么人们可以调查并告诉您更多信息。
旁注:

  • 根据您的输出,堆内存消耗正在增长到 ~4 GB;不知道为什么你认为它最高为 1.2 GB。
  • 永远不需要调用 global.gc()手动;当内存压力很高时,垃圾收集器将自动启动。也就是说,如果某些东西使旧对象保持可访问性,那么垃圾收集器将无能为力。
  • 关于运行 js 脚本以每分钟从 api 获取数据时 Javascript 堆内存不足 - javascript/node.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67911370/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com