2012-05-11 2 views
1

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

Например, это то, что я сейчас:

res.list = parLapply(cl, mynames, myfun, listA, listB, listC, listD) 

myfun = function(name, listA, listB, listC, listD) { 
    matrixA = listA[[name]] 
    matrixB = listB[[name]] 
    matrixC = listC[[name]] 
    matrixD = listD[[name]] 
} 

Проблема, которую я имею что матрицы очень велики, и я подозреваю, называя parLapply() на полных списков включает в себя передачу всех данных каждый узел кластера. Это может быть очень трудоемким и снижает производительность кластера.

Как разбить списки перед вызовом myfun() и отправлять только соответствующие матрицы для каждого узла для обработки?

+0

Похоже, что mapply() - это то, что мне нужно, но оно недоступно в снегу. –

ответ

3

clusterMap() делает работу:

res.list = clusterMap(cl, myfun, mynames, listA, listB, listC, listD) 

Как-то parMapply() обертка была оставлена ​​из пакета.

0

Я думаю, что ответ, данный Робертом Кубриком, наилучшим образом отвечает на этот вопрос, используя clusterMap. Тем не менее, я думаю, что другие люди, которые ищут ответ на соответствующий вопрос, могут извлечь выгоду из другого варианта: mcmapply (который является многоядерной версией mapply). Например:

mcmapply(rep, 1:4, 4:1) 

mcmapply реализует параллельный mapply с помощью Разветвляющихся, что означает, что это не вариант на машинах Windows. Кроме того, могут возникнуть осложнения, если вы используете R в графическом интерфейсе. Кстати, есть также mclapply, который является многоядерной версией lapply.

Так mcmapply и mclapply простейшие версии того, что вы могли бы ожидать, чтобы называться parMapply и parLapply.