mclapply遇到错误,具体取决于核心ID?

时间:2018-10-10 17:29:30

标签: r parallel-processing mclapply

我有一组基因,需要为它们并行计算一些系数。 在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个内核,它是gene_array的4、11、18、25,... 95个元素(每7个),当R与6个内核一起工作时,索引为2、8、14 ,...,98(每6位),并且以相同的方式使用5个内核-每5位。

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

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

1 个答案:

答案 0 :(得分:1)

仔细阅读mclapply的manpage可以发现,此行为是设计使然,它是由于以下两者之间的相互作用而产生的:

(a)

  

”输入X分为与核心数量一样多的部分(当前   这些值按顺序分布在各个核心上,即第一个值   到内核​​1,第二个到内核2,...(内核的第1个值)到内核1等)   然后将一个过程分叉到每个核心,结果是   收集。”

(b)

  

将为其中涉及的所有值返回一个“ 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,其中我还提供了一种错误处理方法,仅对产生错误的索引产生错误。

您还可以仅通过传递AND NOT EXISTS(SELECT 1 from dbo.EmployeeTable e INNER JOIN dbo.ResourceTable r on e.empID = r.employeeID WHERE r.TypeID = 2 --this is internal employees AND e.EmployeeName = x.UserName --this user name comes from a join earlier on in my code.) 来获取产生错误的索引的错误。