R | 您所在的位置:网站首页 › lapply函数 › R |
mclapply 使用 Forking 的 lapply 和 mapply 并行版本 Description mclapply 是 lapply 的并行化版本,它返回与 X 长度相同的列表,其中每个元素是将 FUN 应用于 X 相应元素的结果。 它依赖于分叉,因此在 Windows 上不可用,除非 mc.cores = 1 。 mcmapply 是 mapply 的并行化版本, mcMap 对应于 Map 。 Usage mclapply(X, FUN, ..., mc.preschedule = TRUE, mc.set.seed = TRUE, mc.silent = FALSE, mc.cores = getOption("mc.cores", 2L), mc.cleanup = TRUE, mc.allow.recursive = TRUE, affinity.list = NULL) mcmapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE, USE.NAMES = TRUE, mc.preschedule = TRUE, mc.set.seed = TRUE, mc.silent = FALSE, mc.cores = getOption("mc.cores", 2L), mc.cleanup = TRUE, affinity.list = NULL) mcMap(f, ...) Arguments X向量(原子或列表)或表达式向量。其他对象(包括分类对象)将被 as.list 强制。 FUN该功能应用于( mclapply ) X 或( mcmapply )与 ... 并行的每个元件。 f该功能与 ... 并行应用。 ...对于 mclapply , FUN 的可选参数。对于 mcmapply 和 mcMap 、向量或列表输入:请参阅 mapply 。 MoreArgs, SIMPLIFY, USE.NAMESsee mapply. mc.preschedule如果设置为 TRUE ,则计算首先被划分为(最多)与核心数量相同的作业,然后启动作业,每个作业可能涵盖多个值。如果设置为 FALSE ,则为 X 的每个值分叉一个作业。前者更适合 X 中的短计算或大量值,后者更适合完成时间方差较大且 X 值(与 mc.cores 相比)不多的作业。 mc.set.seedSee mcparallel. mc.silent如果设置为 TRUE ,那么对于所有分叉的并行进程,“stdout”上的所有输出都将被抑制(“stderr”不受影响)。 mc.cores要使用的核心数量,即最多同时运行多少个子进程。如果设置了该选项,则从环境变量 MC_CORES 初始化。必须至少为一,并且并行化至少需要两个核心。 mc.cleanup如果设置为 TRUE ,则在此函数返回之前,所有由此函数分叉的子级都将被杀死(通过发送 SIGTERM )。正常情况下 mclapply 等待子进程传递结果,因此该选项通常仅在 mclapply 被中断时才有效。如果设置为 FALSE ,则收集子进程,但不会强制终止。作为特殊情况,此参数可以设置为用于杀死子进程的信号编号,而不是 SIGTERM 。 mc.allow.recursive除非 true,否则在子进程中调用 mclapply 将使用子进程,而不会再次 fork。 affinity.list包含 X 每个元素的 CPU 关联掩码的向量(原子或列表)。CPU 关联性掩码描述了允许给定项目在哪个 CPU(核心或超线程单元)上运行,请参阅 mcaffinity 。要使用此参数,必须禁用预调度 ( mc.preschedule = FALSE )。 Detailsmclapply 是 lapply 的并行版本,提供 mc.cores > 1 :对于 mc.cores == 1 ( affinity.list 是 NULL ),它简单地调用 lapply 。 默认情况下( mc.preschedule = TRUE ),输入 X 被分成与核心数量一样多的部分(目前这些值按顺序分布在核心上,即第一个值到核心 1,第二个值到核心 2,...(核心 + 1)- th 值到核心 1 等),然后将一个进程分叉到每个核心并收集结果。 如果不进行预先调度,则会为 X 的每个值分叉一个单独的作业。为了确保同时运行的作业数量不超过 mc.cores ,一旦分叉了该数量的作业,主进程就会在下一个分叉之前等待子进程完成。 由于执行的并行性质,随机数不像使用 lapply 时那样是连续的(在随机数序列中)。它们对于每个分叉进程都是连续的,但并非所有作业作为一个整体都是连续的。请参阅 mcparallel 或包装的插图,了解使用 mc.preschedule = TRUE 重现结果的方法。 注意:文件描述符(和进程)的数量通常受到操作系统的限制,因此您可能会在使用超过 100 个核心左右时遇到问题(请参阅操作系统文档中的 ulimit -n 或类似内容),除非您提高允许的打开文件的限制描述符(fork 将失败并出现错误 "unable to create a pipe" )。 在 R 3.4.0 之前以及在 32 位平台上,每个分叉进程的 serialize d 结果仅限于2^31 - 1字节。(通过序列化返回非常大的结果效率低下,应该避免。) affinity.list 可用于在特定 CPU 上运行 X 的元素。如果 X 的元件完成时间差异很大或者硬件架构是异构的,这会很有帮助。它还可以开发调度策略来优化并行作业的整体运行时间。如果设置了 affinity.list ,则 mc.core 参数将替换为关联掩码中使用的 CPU ID 数。 Value对于 mclapply ,与 X 长度相同的列表,并以 X 命名。 对于 mcmapply 、列表、向量或数组:请参阅 mapply 。 对于 mcMap ,有一个列表。 每个分叉进程都在 try(..., silent = TRUE) 内运行其作业,因此如果发生错误,它们将作为 "try-error" 类对象存储在返回值中,并给出警告。请注意,该作业通常会涉及多个 X 值,因此将为失败所涉及的所有值返回一个 "try-error" 对象,即使并非全部都失败。如果任何分叉进程因任何原因被终止或未能提供结果,则失败涉及的值将为 NULL 。为了允许检测此类错误, FUN 不应返回 NULL 。从 R 4.0 开始,当 mcmapply 需要包含 "try-error" 对象时, mcmapply 的返回值始终是一个列表( SIMPLIFY 被覆盖为 FALSE )。 Warning强烈建议不要在 GUI 或嵌入式环境中使用这些函数,因为它会导致多个进程共享同一 GUI,这可能会导致混乱(甚至可能崩溃)。子进程永远不应该使用屏幕上的图形设备。 为了使其在 macOS 上的 R.app 中可用,已采取一些预防措施,但第三方前端的用户应查阅其文档。 请注意,出于这些目的,tcltk 被视为 GUI,因为 Tcl 运行事件循环。该事件循环在子进程中被禁止,但 Tk 图形连接仍然可能存在问题。 强烈建议不要将这些函数与多线程 libraries 或程序包一起使用(有关更多详细信息,请参阅 mcfork )。如果有疑问,使用非 FORK 集群会更安全(请参阅 makeCluster 、 clusterApply )。 Author(s)Simon Urbanek 和 R 核心。 affinity.list 由多特蒙德工业大学的 Helena Kotthaus 和 Andreas Lang 专题报道。源自以前的多核包CRAN. See Alsomcparallel 、 pvec 、 parLapply 、 clusterMap 。 simplify2array 的结果与 sapply 类似。 Examples simplify2array(mclapply(rep(4, 5), rnorm)) # 对所有值使用相同的随机数 set.seed(1) simplify2array(mclapply(rep(4, 5), rnorm, mc.preschedule = FALSE, mc.set.seed = FALSE)) ## 将此与 clusterCall 的示例进行对比 library(boot) cd4.rg |
CopyRight 2018-2019 实验室设备网 版权所有 |