【问题标题】:How to profile the loading of an R package如何分析 R 包的加载
【发布时间】:2019-07-16 09:27:52
【问题描述】:

我编写了这个 R 包,它需要很长时间(> 10 秒,有时长达 20-30 秒!)才能加载。

每次包加载,比如在步骤"** testing if installed package can be loaded"构建包时,或者直接调用library("my.package"),20s内什么都没有发生。

这使得开发过程中的一切都变得非常缓慢:构建文档、构建包、运行 R 检查......

我当然有我的怀疑(看着你,狡猾的依赖),但我需要在取消之前收集证据。

有没有办法分析包的加载情况,以确定原因?或者更一般地说,我如何才能弄清楚幕后发生了什么?

【问题讨论】:

  • 构建文档的缓慢步骤是加载 ("Loading my.package...")。构建包时的缓慢步骤是“** testing if installed package can be loaded”。只需直接调用library("my.package") 需要10-20 秒。确实是加载似乎很慢。
  • 你有没有在加载(附加?)或在该步骤调用其他包时完成任何操作?
  • @NelsonGon 我不知道。我在/R 中的代码只定义了函数和一些小的硬编码向量。我在/data.rda 文件中也有一个小数据集。我很确定这来自在附加上执行操作的依赖项之一,但我有超过 30 个,所以反复试验会很烦人(它不仅仅是删除DESCRIPTION 中的包,而是编辑NAMESPACE 或删除@importFrom, ETC)。如果可能的话,我宁愿做个人资料,因为我现在可以忍受这个问题。
  • 你不能在loadNamespace()上使用profvis吗?
  • 也许可以在那些 30 个包上创建一个调用 library 的 R 脚本并分析这个 R 脚本?

标签: r profiling r-package


【解决方案1】:

所以使用@davide-lorino 的分离方法的一个问题是,如果有纠缠的dependsimports,它会失败,并且很难失败。

更好的方法是使用 future 后端,在干净的 R 会话中加载每个 imports,并计算通过 library 加载它们所需的时间。

我在一个可能对其他人有用的包中实现了这一点:https://github.com/rmflight/importedPackageTimings

【讨论】:

    【解决方案2】:

    您可以通过对加载您正在测试的每个库的调用进行基准测试来确定加载时间最长的库。

    关键是确保卸载库。如果您在重新加载库之前保持加载它们,library() 函数将确定库已加载并返回。在 100 次运行的典型基准测试中,其中 1 次表示加载库所用的时间,其余 99 次表示library() 确定库已加载所用的时间。结果(持续时间)将是 100 次运行的总和,产生的数字非常小,结果之间几乎没有差异,如下所示:

    当你真正想要的看起来更像:

    为我们的努力带来了一个不那么令人惊讶的结果。

    附: detach_package() 函数是这样实现的:

    detach_package <- function(pkg, character.only = FALSE)
    {
      if(!character.only)
      {
        pkg <- deparse(substitute(pkg))
      }
      search_item <- paste("package", pkg, sep = ":")
      while(search_item %in% search())
      {
        detach(search_item, unload = TRUE, character.only = TRUE)
      }
    }
    

    【讨论】:

    • 不像我想要的那样自动化,但谢谢!我想我会使用你的想法,但我会从DESCRIPTION文件中读取依赖项并以编程方式测试包。此外,这是假设缓慢问题来自另一个包的加载阶段......但在某些时候必须有其他事情发生。假设我回到慢包链直到找到罪魁祸首,我该如何诊断它?我欢迎另一个更笼统的答案,解释如何看待“幕后”发生的事情。
    • 另外考虑到观察到的延迟幅度(约 10 秒),我不妨使用times=1 运行基准测试,而不用担心分离包。
    猜你喜欢
    • 2023-03-08
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    相关资源
    最近更新 更多