You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

循环调用read_html_live致Mac卡顿崩溃,Chrome Helper进程过多求助

解决Chrome渲染进程过多导致Mac性能下降的问题

核心问题分析

你的代码存在语法错误,且错误分支未处理会话关闭逻辑——当read_html_live报错时,data被赋值为字符串"nothing returned",后续data$session$close()执行失败,对应Chrome渲染进程无法关闭,循环次数累积后就会大量占用系统资源,导致Mac变慢甚至崩溃。

具体解决方案

1. 修正代码逻辑,确保会话必关闭

先修复tryCatch的语法问题,同时在错误分支也处理会话清理:

for (x in 1:nrow(links)) {
  data <- tryCatch({
    read_html_live(links[x])
  },
  error = function(e) {
    message("页面读取失败: ", e$message)
    NULL  # 错误时返回NULL,方便后续判断
  })
  
  # 仅当data是有效会话对象时执行关闭
  if (!is.null(data) && exists("session", where = data)) {
    data$session$close()
  }
  data <- NULL  # 显式释放变量内存
  gc()  # 强制触发垃圾回收,释放系统资源
}

2. 应急清理残留进程

如果已经堆积大量进程,可手动快速清理:

  • 打开「活动监视器」,搜索「Google Chrome Helper (Renderer)」,选中所有进程后点击左上角「停止」按钮,选择「强制退出」。
  • 或在终端执行批量关闭命令:
pkill -f "Google Chrome Helper (Renderer)"

3. 优化爬虫逻辑减少进程创建

  • 复用会话:避免每次循环新建会话,初始化一次会话后重复使用,能大幅降低进程数量:
# 提前初始化一个会话(替换为目标站点的基础URL)
session <- session_live("https://www.example.com")

for (x in 1:nrow(links)) {
  data <- tryCatch({
    session_jump_to(session, links[x])
    read_html(session)
  },
  error = function(e) {
    message("页面读取失败: ", e$message)
    NULL
  })
  
  data <- NULL
  gc()
}

# 循环结束后统一关闭会话
session$close()
  • 控制并发数:如果必须多会话,用future或foreach包限制并发量,避免一次性启动过多Chrome进程。

4. 调整Chrome进程限制(可选)

打开Chrome设置→「系统」,关闭「硬件加速模式」可减少渲染进程资源占用;也可通过终端命令限制渲染进程数量:

defaults write com.google.Chrome RendererProcessLimit -int 10

该命令将Chrome渲染进程上限设为10个,超出后会自动回收旧进程。

内容的提问来源于stack exchange,提问作者nickfarnell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 00:48:17