R 为什么我的二级期货会连续执行?
我正在尝试复制中的示例。引述: 期货可以嵌套在R中,以便一个期货创建另一组期货 等等例如,这可能发生在嵌套for循环中[…] 有一部分作者使用R 为什么我的二级期货会连续执行?,r,parallel-processing,r-future,R,Parallel Processing,R Future,我正在尝试复制中的示例。引述: 期货可以嵌套在R中,以便一个期货创建另一组期货 等等例如,这可能发生在嵌套for循环中[…] 有一部分作者使用plan(list(multicore,multicore))(进一步的参数和tweak省略)同步处理两个期货,每个期货同步处理四个期货。这应等于同步处理的八个期货 然而,当我试图用下面的代码重现这一点时,我看到第二级期货是按顺序处理的。我做错了什么 MCVE 作者:这是因为有一个内置的保护,防止嵌套并行。如果没有它,您的计算机将因太多并行进程而过载,这不
plan(list(multicore,multicore))
(进一步的参数和tweak
省略)同步处理两个期货,每个期货同步处理四个期货。这应等于同步处理的八个期货
然而,当我试图用下面的代码重现这一点时,我看到第二级期货是按顺序处理的。我做错了什么
MCVE
作者:这是因为有一个内置的保护,防止嵌套并行。如果没有它,您的计算机将因太多并行进程而过载,这不仅会使计算机过热,还会降低总体性能
我已在下一版本中更新了“未来拓扑”渐晕图,包括以下部分:
针对递归并行性的内置保护
在上面,我们并行地处理了未来的外部或内部集合。如果我们想并行处理这两个层呢?很容易使用:
plan(list(multiprocess, multiprocess))
虽然这没有给出错误,但我们会发现,期货的内层将按顺序处理,就像我们将使用plan(list(multiprocess,sequential))
一样。这种行为是由于内置了针对嵌套并行性的保护。如果两个层并行运行,每个层使用机器上可用的8个内核,那么我们将运行8*8=64个并行进程——这肯定会使我们的计算机过载。内部情况是,对于外层,availableCores()
等于八(8),而对于内层,它等于一(1)
现在,我们可以想象,我们用两个平行期货来处理外层,然后用四个平行期货来处理内层。在这种情况下,我们最多只能运行8个内核(=2*4)。这可以通过在每层强制固定数量的工人来实现(不推荐):
如果您想实现像您期望的那样的并行处理,这是一个选择。 只需使用:
图书馆(future.callr)
计划(列表(callr,callr))
什么是returnStartStop
?@F.PrivéAh drat,我忘了包括它。编辑。有趣的是,我不知道callr和future.callr!这实际上是一个错误,包(我是作者)不能防止递归并行处理。这将在下一个版本中修复。有没有理由不建议对每一层设置一定数量的工人?
R version 3.4.3 (2017-11-30)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: CentOS Linux 7 (Core)
Matrix products: default
BLAS: /opt/Bio/R/3.4.3/lib64/R/lib/libRblas.so
LAPACK: /opt/Bio/R/3.4.3/lib64/R/lib/libRlapack.so
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] ggplot2_2.2.1 future_1.8.1
loaded via a namespace (and not attached):
[1] Rcpp_0.12.17 devtools_1.13.4 munsell_0.4.3 colorspace_1.3-2
[5] R6_2.2.2 rlang_0.1.6 httr_1.3.1 plyr_1.8.4
[9] globals_0.11.0 tools_3.4.3 parallel_3.4.3 grid_3.4.3
[13] gtable_0.2.0 git2r_0.21.0 withr_2.1.1 yaml_2.1.16
[17] lazyeval_0.2.1 digest_0.6.15 tibble_1.4.2 codetools_0.2-15
[21] curl_3.1 memoise_1.1.0 compiler_3.4.3 pillar_1.1.0
[25] scales_0.5.0 listenv_0.7.0
plan(list(multiprocess, multiprocess))
plan(list(tweak(multiprocess, workers = 2), tweak(multiprocess, workers = 4)))