У меня большой набор данных (около 40 миллионов строк x 4 столбца), и я хочу выполнить тест Фишера для данных в каждой строке.
Пример данных выглядит так:
refAppleBase altAppleBase refHawBase altHawBase
1 115 1 94 0
2 117 4 93 1
3 125 4 94 1
4 107 26 89 12
5 87 53 66 38
6 68 58 64 32
Я написал следующий скрипт, который по существу берет каждую строку, конвертирует в матрицу, чтобы она могла работать на базовой функции fisher.test()
в R, а затем выплевывает отношение шансов и p-значение.
fisher.odds.pval <- function(table){
fisher <- fisher.test(matrix(unlist(table), nrow=2, ncol=2))
p.val <- fisher$p.value
odds <- unname(fisher$estimate)
return(cbind(odds, p.val))
}
Теперь, очевидно, это немного неуклюже, и я хочу запустить его через 40 миллионов строк, поэтому, чтобы сэкономить время, я написал следующий скрипт, используя пакеты foreach
и doParallel
для распараллеливания этого между несколькими ядрами.
library(doParallel)
library(foreach)
cl <- makeCluster(10)
registerDoParallel(cl)
results <- foreach(i=1:nrow(dat)) %dopar% {
fisher.odds.pval(table=dat[i,])
}
stopCluster(cl)
Я использовал doParallel
в прошлом с большим успехом. Однако при запуске вышеуказанного скрипта я вижу, как ядра "просыпаются" и загружают данные, но затем сразу же засыпают. Тогда кажется, что только одно ядро выполняет все вычисления. Вот снимок экрана top
, когда работает приведенный выше код.
захват верхнего экрана
Примечание. Когда я запускаю приведенный выше скрипт для меньшего набора данных, используя %do%
вместо %dopar%
, он работает, поэтому я подозреваю, что между способами foreach
и doParallel
происходит что-то подозрительное? Но действительно потерял здесь и сейчас. Любая мысль с благодарностью.