首页 > 解决方案 > mclapply 根据核心 ID 遇到错误?

问题描述

我有一组基因,我需要并行计算一些系数。在内部计算系数GeneTo_GeneCoeffs_filtered,将基因名称作为输入并返回 2 个数据框的列表。

拥有 100 个长度gene_array,我使用不同数量的核心运行此命令:5、6 和 7。

Coeffslist=mclapply(gene_array,GeneTo_GeneCoeffs_filtered,mc.cores = no_cores)

根据分配给mclapply.

GeneTo_GeneCoeffs_filtered无法返回其具有模式的数据框列表的基因索引。在分配给 mclapply 的 7 个核心的情况下,它是(每 7 个)的 4、11、18、25、... 95 个元素gene_array,当 R 使用 6 个核心时,索引是 2、8、14、...、 98(每 6 个)和 5 个内核的相同方式 - 每 5 个。

最重要的是它们对于这些过程是不同的,这意味着问题不在于特定的基因。

我怀疑可能存在无法正确运行我的功能的“损坏”核心,只有它会产生此错误。有没有办法追溯其 id 并将其从 R 可以使用的核心列表中排除?

标签: rparallel-processingmclapply

解决方案


仔细阅读 mclapply 的联机帮助页会发现,这种行为是设计使然,它是以下交互的结果:

(一种)

“输入 X 被分成与核心一样多的部分(当前值按顺序分布在核心中,即第一个值到核心 1,第二个到核心 2,......(核心 + 1)-th 值到核心1等),然后将一个进程分叉到每个核心并收集结果。”

(二)

将针对失败中涉及的所有值返回一个“try-error”对象,即使并非所有值都失败了。

在您的情况下,凭借(a),您的gene_array 以“循环”方式分布在核心上(连续元素的索引之间有 mc.cores 的间隙),并且凭借(b),如果有的话gene_array 元素引发错误,您会为每个发送到该核心的gene_array 元素返回一个错误(这些元素的索引之间有mc.cores 的间隙)。

我昨天在与 Simon Urbanek 的交流中刷新了我对这一点的理解:https ://stat.ethz.ch/pipermail/r-sig-hpc/2019-September/002098.html在其中我还提供了一种错误处理方法仅针对产生错误的索引的错误。

您还可以仅通过传递生成错误的索引来获取错误mc.preschedule=FALSE


推荐阅读