【问题标题】:Puppeteer on Heroku, memory errorsHeroku 上的 Puppeteer,内存错误
【发布时间】:2019-08-05 23:43:56
【问题描述】:

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

【问题讨论】:

    标签: heroku puppeteer


    【解决方案1】:

    我遇到了类似的问题。我发现如果您不关闭浏览器,您将立即收到 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);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-02
      • 2013-10-01
      • 2016-11-25
      • 1970-01-01
      • 2014-07-14
      • 2021-07-13
      • 1970-01-01
      相关资源
      最近更新 更多