微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何阻止nodejs在内存不足时杀死子进程?

如何解决如何阻止nodejs在内存不足时杀死子进程?

我正在使用 Node.Js 和大文件。我正在调用 python 脚本的子进程来处理这些大文件。现在的问题是,在大文件上,内存耗尽,节点 js 通过杀死它来中止进程。我知道 --max-old-space-size 但我不只是想限制大小。如果内存不足,我希望 node.js 继续处理该进程。 F

例如,Node.js 在 1 分钟内执行一个允许 2GB ram 的进程。我将内存大小限制为 1GB ram,它应该在 2 分钟内运行该过程,但不会出错。它应该使用队列或其他东西。

编辑: 这是我使用 spawn 从子进程执行的命令。

let extExecCommand = "cat file.json | python sample-script.py > output-file"
let extensionScript = childProcess.spawn(extExecCommand,{shell: true});

当file.json的大小非常大时,节点会中止进程并杀死子进程。我不希望这种情况发生。我希望 node js 继续执行流程并维护某种类型的数据结构。

解决方法

我希望 node.js 在内存不足时继续处理进程?*

猜想避免 Heap-Out-of-Memory 错误是不可能的。

你可以使用两件事。

首先,delegate a separate process to PM2 带有 -max-memory-restart 选项并通过生态系统文件运行它,例如:pm2 start test.yaml

apps:
  - script: ./index.js
    name: 'PYTHON'
    instances: 1
    out_file: "/dev/null"
    autorestart: true
    max_memory_restart: '100M'
    log_date_format: 'DD/MM HH:mm:ss.SSS'

第二个选项是使用各种队列作业管理器,如 Bree、Bull、Agenda,将您的资源丰富的任务放在那里,将作业分成几部分(如果可能),然后进行管理。 Node.js 通过 worker_thread 实现。

但我想,您的项目架构有问题,不应该存储如此多的数据in-memory。您可以通过 streams 从数据库或其他存储中访问大文件或数据。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。