【发布时间】: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