我有一组基因,我需要并行计算一些系数。 系数在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 个内核的情况下,它是 4、11、18、25、...gene_array
的 95 个元素(每 7 个(,当 R 使用 6 个内核时,索引为 2、8、14,...,98(每 6 个(,5 个内核也是如此 - 每 5 个。
最重要的是,它们在这些过程中是不同的,这意味着问题不在于特定的基因。
我怀疑可能有"损坏"的核心无法正确运行我的函数,只有它会产生此错误。有没有办法追溯其 id 并将其从 R 可以使用的内核列表中排除?
仔细阅读 mclapply 的手册页会发现,这种行为是设计使然,它是以下两者之间交互的结果:
(一(
"输入 X 被分成与内核一样多的部分(目前 这些值按顺序分布在内核中,即第一个值 到核心 1,次于核心 2,...(核心 + 1(-核心 1 的第个值等( 然后将一个进程分叉到每个内核,结果是 收集。
(二(
将为 失败,即使不是全部失败。
在你的例子中,由于 (a(,你的gene_array在内核之间分布"循环"样式(连续元素的索引之间有 mc.core 的间隙(,并且凭借 (b(,如果任何gene_array元素引发错误,你会为发送到该核心的每个gene_array元素返回一个错误(在这些元素的索引之间有一个 mc.core 的间隙(。
我在昨天与Simon Urbanek的交流中更新了对此的理解:https://stat.ethz.ch/pipermail/r-sig-hpc/2019-September/002098.html 我还提供了一种错误处理方法,该方法仅对生成错误的索引产生错误。
对于通过传递mc.preschedule=FALSE
生成错误的索引,也可以仅获取错误。