• R语言已解决
  • 编译大型 R Markdown 格式文档会导致 Hugo / blogdown 网站无响应

问题说明

今年给统计之都投稿或编辑了几篇大型的 R Markdown 格式的稿件,发现了一个问题,第一次使用 blogdown::serve_site() 渲染站点后,再修改一些文档内容,之后保存,等待再次渲染完成,然后预览窗口就死掉了,浏览器里也无法刷新,好像 Hugo 失联了。

复现过程

比如最近的一篇投稿文章地震越来越频繁了吗?,克隆仓库,切换到 quakes 分支,本地预览网站。下面是操作、复现问题的视频

https://user-images.githubusercontent.com/12031874/192187907-2503b3bc-a6f5-4e01-8b00-a9695b74098b.mp4

这个问题,我尝试过一些探索

  1. 添加很多小节,运行正常,貌似与小节数量无关。
  2. 添加很多小节,每个小节下添加代码块,只要代码块执行得很快也没事。
  3. 但是遇到有图、有代码,而且还很多的情况下,就容易崩溃了。我猜测是因为执行时间有点长,比如几十秒、几分钟,图也很多,导致频繁刷新页面,最终与 Hugo 失联,网页崩溃。

如果不使用 RStudio IDE 网页一样会崩溃,录制的操作视频如下

https://user-images.githubusercontent.com/12031874/192189162-6ba4a52a-3a51-49a9-9f08-276fe5eb335f.mp4

抱歉,无法做更多简化,一旦简化就复现不了问题,而且在复杂 R Markdown 文档下,也不能 100% 稳定复现,但是10次操作,应该有 7-8 次崩溃。所以问题根源猜测是 blogdown / hugo / rmarkdown 这方面。

问题的影响

对于复杂的 R Markdown 文档,往往要经过很多次修改,经常崩溃会导致体验很差。

软件信息

> xfun::session_info(packages = c("blogdown", "rmarkdown"), dependencies = F)
R version 4.2.1 (2022-06-23)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Monterey 12.6, RStudio 2022.7.0.543

Locale: en_US.UTF-8 / en_US.UTF-8 / en_US.UTF-8 / C / en_US.UTF-8 / en_US.UTF-8

Package version:
  blogdown_1.13  rmarkdown_2.16

Hugo version: 0.101.0

Pandoc version: 2.19.2

RStudio 2022.07.0-preview+543 "Spotted Wakerobin" Preview (e4a9a78e039439aee3b2edb54b22f8587e78704a, 2022-06-24) for macOS
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) RStudio/2022.07.0-preview+543 Chrome/102.0.5005.63 Electron/19.0.4 Safari/537.36

如果使用 RStudio IDE 最新的稳定版,也会停止响应,但是没有上面那么视频夸张,整个软件崩溃。

    Cloud2016 装 processx 包了吗?

    另外,可以用 ps -A | grep hugo 看看 hugo 是不是真的挂了。

    我也不知道为什么会这样。如果最终查不出原因,也许可以试着缓存一下那些慢的代码段。

      yihui 缓存可以有些缓解。processx 包也装了,版本是 3.7.0 。
      没有用 RStudio IDE,在 R控制台运行 blogdown:::serve_site() 后,在 RMarkdown 文档里增加一个空行,等待编译完成,编译前后用 ps -A | grep hugo 看了后,确认是挂了。

      可见 Hugo 挂了后,顺带拖垮了 RStudio IDE。

      我把 library(sf) 都去掉避免直接加载 sf,使用 Google R style guide 中的 qualifying namespaces 风格,把每个 sf 函数都加上显式的命名空间 sf:: 来调用,好像解决了问题。至少在我的机器上 (M2 Air) 没有再出现 Hugo 失联的情况了。(重启 RStudio 5 次,每次编辑保存预览 10 次)

      想到这点是因为每次重新渲染都会出现

      Linking to GEOS 3.10.2, GDAL 3.4.2, PROJ 8.2.1; sf_use_s2() is TRUE

      所以猜测可能是显式加载 sf 引入的某些二进制库会产生了某种 race condition。

        nan.xiao 有点奇怪,通过命名空间导入的方式,即不直接加载 sf 包,每个 sf 相关的函数前加上 sf:: 我理解本质还是会调用 GEOS/GDAL/PROJ 三大外部库去实现函数功能,对 sf 来说,就是 sf 包下 libs 目录下的 sf.sosf.so.dSYM 动态链接库。我从 CRAN 下载的是编译打包好的 sf 包,而不是从源码编译的。 我基本不了解 C++ 所以想请问 race condition 是什么意思?

        另外,我的 Mac 是 2019 版的 Intel CPU,会和这个硬件有关系吗?因为我全部替换为从命名空间导入的方式还是不行,问题依旧。

        nan.xiao 另外,在你的系统上,不替换也会出现类似问题吗?而替换后就都好了?

        @Cloud2016 又测试了几次,这次无论如何也无法复现原来的问题了。 😂 而之前确实是可以复现的,改成了 sf:: 以后就解决了。也许问题的根源并不在这里,我只是偶然触发了能恰好解决问题的条件。

        race condition 大概就是说在一个并发的环境中执行某些事情的顺序和时机不对会引起问题。

        Anyways, 推荐找一台 ARM 架构的 Mac 或者 PC 的环境试验一下。

        另外,我的 Hugo 是通过 Homebrew 安装的最新版本 0.104.1, RStudio Desktop 2022.07.2 Build 576。

          nan.xiao 我也将 Hugo 升级到 0.104.1 试试看,Hugo 从 0.101 到 0.104.1 改动还挺多的。

          @yihui 我把 Hugo 升级到 0.104.1 之后,情况有改善,就是 Hugo 没有挂掉。改动 R Markdown 文档,等待编译完成后,网站页面显示,刷新什么的都不管用。

          RStudio IDE 测试环境换成了最新稳定版和 nan.xiao 保持一致。我的 Hugo 也是从 Homebrew 安装的。

          RStudio 2022.07.2+576 "Spotted Wakerobin" Release (e7373ef832b49b2a9b88162cfe7eac5f22c40b34, 2022-09-06) for macOS
          Mozilla/5.0 (Macintosh; Intel Mac OS X 12_6_0) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/5.12.10 Chrome/69.0.3497.128 Safari/537.36

            Cloud2016 这我又不懂了。我刚把 .gitkeep 文件删了,你看看是否有任何改进。

            我有另一个更本质的修正办法,就是重新编译 Rmd 之前把 hugo 进程暂停。在更早期的 blogdown 版本中我是这么做的,我现在想不起来为什么后来我把它移除了,我得再看一下这部分的历史修改记录。

              yihui 编译后,点击网站其它地方或刷新页面, chtimes 的问题变成了

              open /BingSiteAuth.xml: read-only file system 

              网站还是挂了的

                yihui 我虽然不清楚里面的原理,但是发现问题解决了。逻辑也比较清晰,在编译 Rmd 的时候, Hugo 在旁边看着,不要动,等编译完了后,Hugo 再上手。

                  Cloud2016 逻辑正是如此。Hugo 的侦听频率可能太高了,R 仍然在大量修改文件时,它过快做出了反应,所以我得让暂停这个进程,等 R 编完了再恢复它。