2013-02-12 4 views
2

Я работаю с пользовательской случайной функцией леса, которая требует как начальной, так и конечной точки в наборе геномных данных (около 56 тыс. Столбцов).Параллельная обработка в R

Я хотел бы разбить номера столбцов на подгруппы и позволить каждой подгруппе обрабатываться индивидуально, чтобы ускорить процесс. Я попробовал это (безуспешно) с помощью следующего кода:

library(foreach) 
library(doMC) 
foreach(startMrk=(markers$start), endMrk=(markers$end)) %dopar% 
    rfFunction(genoA,genoB,0.8,ntree=100,startMrk=startMrk,endMrk=endMrk) 

Где STARTMRK массив числовых переменных: 1 4 8 12 16 и endMrk еще один массив: 3 7 11 15 19

Для этого примера я хочу одно ядро ​​для запустить образцы 1: 3, другой запустить 4: 7 и т. д. Я новичок в идее параллельной обработки в R, поэтому я более чем готов изучить любую имеющуюся документацию. Кто-нибудь имеет советы по вещам, которые мне не хватает для параллельной обработки или для вышеуказанного кода?

ответ

1

Основной момент заключается в том, что вы разбиваете свои столбцы на куски, справа. Во-первых, было бы лучше, если бы на каждом этапе итерации было аккуратно распределить ваш набор данных и подавать куски в РФ. Кроме того, Еогеасп работает так же, как и для некоторых способов, так что код может быть

rfs=vector('list',4) 
foreach(i=1:4) %dopar% { 
    ind <- markers$start[i]:markers$end[i] 
    rfs[[i]] <- randomForest(genoA[,ind],genoB[,ind], 0.8, ntree=100) 
} 

Я дал это в очередной RandomForest, но вы можете обернуть это в пользовательский код простым способом.

+0

Это не сработало точно правильно, но когда я что-то вроде: 'г <- Еогеасп (я = 1: 5, .combine = "cbind")% dopar% {RandomForest (Дженоа, genoB, 0.8, ntree = 100, startMrk = маркеры $ start [i], endMrk = маркеры $ end [i])} ' Я получил то, что хотел. Один последний вопрос: пользовательская функция, которую я использую, возвращает список. Есть ли способ выборочно объединить элементы из списка? Спасибо за помощь! – trvrr

+0

Немного поздно, но чтобы ответить на ваш «последний вопрос»: вместо того, чтобы «выборочно комбинировать элементы из списка», почему бы не просто извлечь элемент списка, который вам интересен? Вместо: 'foreach (...)% dopar% {return (list (A = ..., B = ...))}'; try: 'foreach (...)% dopar% {res <- list (A = ..., B = ...); возврата (рес $ A)} '. Кроме того, определите свою собственную функцию '.combine', которая делает то же самое. (Первый вариант приведет к меньшему перемещению данных, важно, если 'res $ B' велико!) – dynamo

Смежные вопросы