试图让Heroku运行某些Puppeteer工作。在本地,它可以工作。它很慢,但是可以用。监视OS X Activity Monitor
中的内存,内存不会超过50MB。但是,当我将此脚本部署到Heroku时,每次都会得到一个Memory quota exceeded
,并且占用的内存更大。
查看日志,我收到消息:
Process running mem=561M(106.5%)
。
Error R14 (Memory quota exceeded)
。
Restarting
。
State changed from up to starting
要么活动监视器未正确报告内存,要么仅在Heroku上运行脚本时出了点问题。我无法想象为什么刮取25页的页面将是561M。
此外,由于Puppeteer脚本必须包含在try/catch
中—内存错误使Dyno崩溃并重新启动。在Dyno重新启动时,浏览器将挂起。因此restarting
的作用很小。有没有办法在Heroku上捕获“大多数”错误,但是在出现内存R14错误时抛出?
答案 0 :(得分:0)
我有一个类似的问题。我发现的是,如果不关闭浏览器,则会立即收到R14错误。我的建议:
确保您使用单个浏览器实例和多个上下文,而不是多个浏览器。
确保在调用pdf后关闭上下文
如果要处理大页面,则需要扩展heroku实例,则别无选择。不幸的是,您需要为heroku上的1GB内存支付50美元...
有些难看的代码,但它指出调用pdf函数后上下文已关闭的事实。
browser.createIncognitoBrowserContext().then((context)=>{
context.newPage().then((page)=>{
page.setContent(html).then(()=>{
page.pdf(options).then((pdf)=>{
let inputStream = bufferToStream(pdf);
let outputStream = fs.createWriteStream(path);
inputStream.pipe(outputStream).on("finish", () => {
context.close().then(()=>{
resolve();
}).catch(reject);
});
});
}).catch(reject)
}).catch(reject)
}).catch(reject);