【问题标题】:Bull generate 2000 files Memory leak node.jsBull 生成 2000 个文件内存泄漏 node.js
【发布时间】:2023-02-10 06:26:20
【问题描述】:

我目前在使用 node.js 和 bull 生成两千个 pdf 时遇到问题。

事实上,我设法生成了大约 400 个 pdf。然后我收到此错误消息:

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory

这是 bull 队列和生成 pdf 文件的函数:

let myFirstQueue = new Bull(
      "firsttdssss",
      {
        redis: { port: 6379 },
      },
      {
        defaultJobOptions: { removeOnComplete: true, removeOnFail: true },
      }
    );

myFirstQueue.setMaxListeners(30);

for (let i = 0; i < 500; i++) {
  await myFirstQueue.add(data[i]);
}

let { generatePdf } = await import("~/lib/survey");

myFirstQueue.process(async job => {
  let filename = kebabCase(
    `${campaign.title} - ${job.data.employee.fullName.toLowerCase()} - ${moment().format("DD/MM/YYYY")} `
  );
  return generatePdf(campaign.template.body, job.data, filename, 210, 297);
});

myFirstQueue.on("progress", () => {
  console.log("progresds");
});

myFirstQueue.on("completed", () => {
  console.log("completed");
});

我已经尝试使用 :$env:NODE_OPTIONS="--max-old-space-size=8192" 来增加 node.js 内存泄漏

【问题讨论】:

  • 一个接一个地做,而不是一次做 2000 个?另外,你不能在map()里面使用await,它不起作用(不等待)。每个人都这样做,但它不起作用。请改用 for 循环。此外,你的map() 甚至没有返回任何东西,所以这是错误的方法,原因有二。
  • 你认为这可以解决内存问题吗?谢谢
  • 好吧,如果您的系统在并发运行 400 个后内存不足,那么一个接一个地执行它们将解决问题 :) 如果您的操作成本很高,请不要并行运行 2000 个,这只是常识。为了加快速度,您可以在中间尝试一些方法,例如一次 10 或 20 个批次,但这实现起来有点棘手
  • 您知道是否存在其他解决方案吗?您知道是否可以使用 node.js 生成两千个 pdf 文件吗?
  • 你知道我在哪里可以使用 10 或 20 个批次来展示代码演示吗?

标签: javascript node.js memory bull bullmq


【解决方案1】:

我会用两个应用程序来做到这一点。 应用程序一将负责在队列中添加作业

应用程序二将是一名工人,它将一个接一个地获取工作,然后生成 pdf..

最后,通过使用 pm2 集群,我将增加工作人员的数量,以便可以并行完成更多工作

【讨论】:

    猜你喜欢
    • 2019-02-06
    • 2012-03-11
    • 2016-01-01
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多