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
не может вернуть список фреймов данных, которые они имеют шаблон. В случае 7 ядер, назначенных для mclapply, это 4, 11, 18, 25, ... 95 элементов gene_array
(каждое седьмое), а когда R работает с 6 ядрами, индексы составляют 2, 8, 14,..., 98 (каждое 6-е) и то же самое с 5 ядрами - каждое 5-е.
Самое главное, что они разные для этих процессов, а это значит, что проблема не в определенных генах.
Я подозреваю, что может быть "сломанное" ядро, которое не может правильно выполнять мои функции, и только оно генерирует эти ошибки. Есть ли способ отследить его идентификатор и исключить его из списка ядер, которые могут быть использованы R?
0 ответов
Внимательное прочтение mclapply в страницах руководства показывает, что это поведение является и возникает в результате взаимодействия:
(а)
"вход X разделен на столько частей, сколько ядер (в настоящее время значения распределяются по ядрам последовательно, то есть первое значение для ядра 1, второе для ядра 2, ... (ядро + 1)-е значение для ядра 1 и т. Д.), А затем по одному процессу разветвляется на каждое ядро и собираются результаты ".
(б)
объект "try-error" будет возвращен для всех значений, связанных с ошибкой, даже если не все из них завершились ошибкой.
В вашем случае, в силу (a), ваш gene_array распространяется в стиле "round-robin" по ядрам (с промежутком в mc.cores между индексами последовательных элементов) и в силу (b), если есть Элемент gene_array вызывает ошибку, вы получаете сообщение об ошибке для каждого элемента gene_array, отправленного в это ядро (с промежутком в mc.cores между индексами этих элементов).
Я обновил свое понимание этого вчера во время обмена мнениями с Саймоном Урбанеком: https://stat.ethz.ch/pipermail/r-sig-hpc/2019-September/002098.html, в котором я также предлагаю подход к обработке ошибок, дающий ошибки только для индексов, генерирующих ошибку.
Вы также можете получить ошибки только для индексов, которые генерируют ошибку, передав mc.preschedule=FALSE
.