【问题标题】:How to stop nodejs from killing a child process on out of memory?如何阻止nodejs在内存不足时杀死子进程?
【发布时间】:2021-03-22 06:35:13
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您没有展示您实际尝试执行的操作或您的任何代码(这使得您很难知道如何提供帮助),但通常您希望将文件分成更小的部分来处理作为流、行或某种块的形式,这样您就不必一次将整个文件放在内存中,而只需其中的一小部分。如果你展示你的实际代码,这里的问题几乎总能得到更好更快的答案,这样我们就可以准确地看到你想要做什么。
  • @jfriend00 请检查我的编辑。

标签: javascript node.js memory-management


【解决方案1】:

如果内存不足,我希望 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,从数据库或其他存储中访问大文件或数据。

【讨论】:

    猜你喜欢
    • 2018-09-08
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 2021-07-01
    • 2022-07-06
    • 2018-09-30
    • 2010-12-08
    相关资源
    最近更新 更多