在函数内部调用 clusterApply 时,性能会下降

2024-06-19

我遇到了一个奇怪的问题clusterApply,我已经能够尽可能地隔离它,如下所示。首先,我从全局环境运行以下代码:

require(parallel)
cl<-makeCluster(rep("localhost",20),"SOCK")
xl<-list()
for(i in 1:20)
  xl[[i]]<-crossprod(matrix(rnorm(1e6),1000,1000))
x<-xl
clusterExport(cl,"x",environment())
f0<-function(z) eigen(x[[z]])
system.time(clusterApply(cl,1:20,f0))
##    user  system elapsed 
##   0.332   0.264   3.334 

现在,为了确保没有发生任何奇怪的情况,请重新启动 R,然后运行这段类似的代码,该代码调用clusterApply从函数内部:

require(parallel)
cl<-makeCluster(rep("localhost",20),"SOCK")
xl<-list()
for(i in 1:20)
  xl[[i]]<-crossprod(matrix(rnorm(1e6),1000,1000))
f<-function(clust,x){
  force(x)
  clusterExport(clust,"x",environment())
  f0<-function(z) eigen(x[[z]])
  print(system.time(clusterApply(clust,1:20,f0)))
}
f(cl,xl)
##   user  system elapsed 
##  5.212   1.888  13.627 

我做了一些搜索并发现这个相关问题的答案 https://stackoverflow.com/a/18037825/2588184,它指出未在全局环境中定义的函数中使用的局部变量将导出到集群。所以我想,也许问题在于x被导出两次,这就是花费很长时间的时间,而不是实际的函数调用。为了测试这一点,我将函数定义更改为:

f0<-function(z) eigen(get("x")[[z]])

我的表现仍然很慢。有谁知道这里会发生什么?

顺便说一句,如果我只是打电话

clusterApply(clust,x,eigen)

在函数内部,那么它就可以正常工作,就像在全局环境中一样快。当然,如果这是我想要解决的问题,我会简单地这样做,但事实并非如此,这只是一个玩具问题,用于隔离我与其他更复杂的代码遇到的问题。


你的表现确实受到了影响,因为变量x正在与f0在每项任务中发挥作用。改变这样的方式f0指的是x没有什么区别:问题与如何做无关f0 uses x或者是否指的是x根本不。和哪里有关系f0本身已定义。如果您在外部定义它f使得相关环境f0是全球环境,那么你的问题就会得到解决。

如果你想定义f0 inside f,可以通过修改环境来修复f0定义之后:

f<-function(clust,x){
  force(x)
  clusterExport(clust,"x",environment())
  f0<-function(z) eigen(x[[z]])
  environment(f0) <- .GlobalEnv
  print(system.time(clusterApply(clust,1:20,f0)))
}

这解决了问题,因为全局环境永远不会与函数一起序列化。

原因是clusterApply(clust,x,eigen)效果很好的是eigen没有定义在f, so x未被捕获时eigen已连载。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在函数内部调用 clusterApply 时,性能会下降 的相关文章

  • 如何获得 lmer 对象的置信区间?

    我正在尝试获取混合模型预测的置信区间 预测函数不输出任何置信区间 很少有StackOverflow答案建议使用merTools包中的predictInterval函数来获取间隔 但是这两个函数的预测估计之间存在差异 我试图在下图中进行比较
  • 将ggplot中条带标签的位置从顶部更改为底部?

    我知道这不完全是一个数据可视化问题 但老板要求这样做 所以我需要弄清楚是否可以 为 2016 年寻找答案的人提供答案 As of ggplot22 0 切换参数 http docs ggplot2 org current facet gri
  • 为不同部分设置 rmarkdown 选项卡颜色

    我想用 Rmarkdown 创建一个 html html 应包含彩色选项卡 根据来自的答案这个问题 https stackoverflow com questions 55276670 coloring tabs in rmarkdown我
  • 使用不同比例的累积分布曲线 (ECDF) 创建 ggplot2 直方图

    使用 ggplot2 我可以使用以下代码创建具有累积分布曲线的直方图 但是 那stat ecdf曲线缩放至左侧 y 轴 library ggplot2 test data lt data frame values replicate 1 s
  • 将 df 拆分为多列的 **tidyverse** 方法是什么?

    我想将数据框分成多列 以便我可以看到summary 数据每个子集的输出 这是一种使用方法来做到这一点split from base library tidyverse gt Loading tidyverse ggplot2 gt Load
  • flextable 中的有条件加粗值

    是否可以根据 tstat 将估计值加粗 着色 对于 ex t stat 的粗体估计值大于 1 96 这是继续我之前的问题 https stackoverflow com questions 69780809 pivot wider crea
  • RcppEigen 包“#pragma clang Diagnostic pop”警告

    我在尝试使用时遇到一些问题RcppEigen包裹 我使用了发布的示例here http gallery rcpp org articles eigen eigenvalues 该函数有效 但 R 生成了一系列类似的警告 示例如下 In fi
  • 箱线图不会用 ggvis 显示

    我正在尝试制作箱线图ggvis即使有一个简单的例子我似乎也无法查看 library dplyr library ggplot2 library shiny I think this is required not sure data fra
  • data.table() 仍然将字符串转换为因子吗?

    据我所见我假设 data table v1 8 0 不会自动将字符串转换为因子 具体来说 引用该页面中的 Matthew Dowle 的话 不需要 stringsAsFactors 在 v1 8 0 中这样做 现在键中允许使用 o 字符列
  • 在 blogdown 中包含图像预览(.Rmd yaml 标头)

    我尝试了几种方法 但到目前为止都没有效果 我想在我的主博客页面上添加用 R markdown Rmd 编写的博客文章的图像预览 其中通常会显示许多帖子和项目 我可以使用以下从 Hugo 获取的代码使其在普通 markdown md 中工作a
  • 为什么 ggplot2 图例不结合手动填充和缩放值?

    预期行为 如果我用 ggplot2 创建一个绘图并使用单独的形状和填充比例来描绘数据 我希望图例会在 白色 填充点 看起来是空心的 和 黑色 填充点 看起来不空洞的 在下面的示例代码中 Windows 的图例项应为白色空心点 Linux 的
  • 您使用 Attach() 或按名称或切片调用变量吗?

    许多介绍 R 的书籍和指南都是从附加一个 R 语言的实践开始的 data frame这样您就可以通过名称调用变量 我一直发现用以下方式调用变量是有利的 符号或方括号切片 2 这样我就可以使用多个data frames 而不混淆它们和 或使用
  • 循环遍历列并将字符串长度添加为新列

    我有一个包含多列的数据框 并且希望为每个列输出一个单独的列 其中包含每行的长度 我试图迭代列名称 并为每列输出一个附加有 length 的相应列 例如 col1 col2 将转到 col1 列2 col1 长度 列2 长度 我正在使用的代码
  • 将值添加到 R 中 for 循环内的向量

    我刚刚开始学习 R 我编写了这段代码来学习函数和循环 squared lt function x m lt c for i in 1 x y lt i i c m y return m squared 5 NULL 为什么这个返回NULL
  • 展平 ggplot2 中的 alpha 通道

    ggplot2 的某些对象 函数 支持 alpha 通道 http docs ggplot2 org current geom point html http docs ggplot2 org current geom point html
  • R 中具有 NA 值的聚合栅格

    我在 R 中有一个分辨率为 1 公里的栅格 其 NA 值分布广泛 但位置不规则 即 包含数据的单元格不连续 并且 NA 值分散 我正在尝试使用用户定义的平均圆角函数 包括在下面 以 5 公里分辨率 因子 5 聚合此栅格 使用 raster
  • 替换为 NA

    我有一个包含条目的数据框 看来这些值没有被视为 NA 因为 is na 返回 FALSE 我想将这些值转换为 NA 但找不到方法 Use dfr dfr
  • 删除 R 中的胡须和异常值

    我有连续的数据 我想用它来绘制R s plotly with a box or violin没有异常值和胡须的绘图 set seed 1 df lt data frame group c rep g1 500 rep g2 700 rep
  • 有没有办法将字母扩展到超过 26 个字符,例如 AA、AB、AC...?

    我大部分时间都使用字母来表示我的因素 但今天我尝试超过 26 个字符 LETTERS 1 32 期待有自动递归因式分解 AA AB AC 但很失望 这只是字母的限制还是有办法使用其他函数来获取我正在寻找的内容 702够吗 LETTERS70
  • 如何规划庭院灯最有效的路线

    我正在尝试挂一些庭院灯 基于另一个问题 https cs stackexchange com questions 80134 christmas light route efficiency我问 我意识到我需要一种算法来解决路由检查问题 h

随机推荐