Heroku上的操纵up,内存错误

时间:2019-03-14 23:12:55

标签: heroku puppeteer

试图让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错误时抛出?

1 个答案:

答案 0 :(得分:0)

我有一个类似的问题。我发现的是,如果不关闭浏览器,则会立即收到R14错误。我的建议:

  1. 确保您使用单个浏览器实例和多个上下文,而不是多个浏览器。

  2. 确保在调用pdf后关闭上下文

  3. 如果要处理大页面,则需要扩展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);