многоядерный с plyr, MC - PullRequest
       30

многоядерный с plyr, MC

6 голосов
/ 21 марта 2012

Привет, я пытаюсь использовать ddply в библиотеке plyr в R, с пакетом MC.Кажется, это не ускоряет вычисления.Это код, который я запускаю:

require(doMC)
registerDoMC(4)
getDoParWorkers()
##> 4
test <- data.frame(x=1:10000, y=rep(c(1:20), 500))
system.time(ddply(test, "y", mean))
  # user  system elapsed 
  # 0.015   0.000   0.015
system.time(ddply(test, "y", mean, .parallel=TRUE))
  # user  system elapsed 
  # 223.062   2.825   1.093 

Есть идеи?

Ответы [ 2 ]

10 голосов
/ 21 марта 2012

Функция mean работает слишком быстро относительно затрат на связь, необходимых для распределения разделенных секций по каждому ядру и получения результатов.

Это распространенная «проблема», с которой сталкиваются люди при распределенных вычислениях. Они ожидают, что это заставит все работать быстрее, потому что забывают о затратах (обмен данными между узлами), а также о преимуществах (использование нескольких ядер).

Нечто специфическое для параллельной обработки в plyr: только функция запускается на нескольких ядрах. Разделение и объединение по-прежнему выполняется на одном ядре, поэтому применяемая функция должна быть очень требовательной к вычислительным ресурсам, чтобы получить преимущество при параллельном использовании функций plyr.

1 голос
/ 08 марта 2013

Продолжение ответа Джошуа, есть исправление, если вы хотите ускорить эту операцию. Он вдохновлен идеологией сокращения карт, и некоторое время назад я сделал POC для образца набора данных.

Я использовал библиотеку снегопада - я думаю, вы можете работать и с doMC.

# On my phone, please pardon typos/bugs

test <- data.frame(x=1:1000000, y=rep(c(1:20), 500))

testList = list()
testList[[1]] <- test[c(1:250000),]
testList[[2]] <- test[c(250001:500000),]
testList[[3]] <- test[c(500001:750000),]
testList[[4]] <- test[c(750001:1000000),]

# Write a function for the above - Need to find optimum number of splits

sfInit(parallel = TRUE, cpus=4)
sfCluster(plyr)
meanList = sfClusterSpplyLB(testList, function(x) ddply(test, "y", mean))

sfStop()

aggregate(meanList, by=list(y), FUN=mean)

Это может помочь вам, учитывая, что мы сейчас выполняем подпрограмму раздельного объединения. Это работает для средств, когда размер разбиений одинаков, работает для сумм, мин / макс, количество и т. Д. В порядке, но есть некоторые операции, для которых мы не можем использовать это.

...