Почему параллельный пакет медленнее, чем просто применение apply?

Я пытаюсь определить, когда использоватьparallel Пакет для ускорения времени, необходимого для запуска некоторого анализа. Одна из вещей, которые мне нужно сделать, - это создать матрицы, сравнивающие переменные в двух фреймах данных с различным количеством строк. Я задал вопрос об эффективном способеПереполнение стека и написал про тесты на моемблог, Поскольку я доволен лучшим подходом, я хотел ускорить процесс, запустив его параллельно. Приведенные ниже результаты основаны на 2 ГГц i7 Mac с 8 ГБ оперативной памяти. Я удивлен, чтоparallel пакет,parSapply в частности, функция хуже, чем просто использованиеapply функция. Код для воспроизведения этого ниже. Обратите внимание, что в настоящее время я использую только один из двух создаваемых мной столбцов, но в конечном итоге хочу использовать оба.

Время выполнения http://jason.bryer.org/images/ParalleVsApplyTiming.png

require(parallel)
require(ggplot2)
require(reshape2)
set.seed(2112)
results <- list()
sizes <- seq(1000, 30000, by=5000)
pb <- txtProgressBar(min=0, max=length(sizes), style=3)
for(cnt in 1:length(sizes)) {
    i <- sizes[cnt]
    df1 <- data.frame(row.names=1:i, 
                      var1=sample(c(TRUE,FALSE), i, replace=TRUE), 
                      var2=sample(1:10, i, replace=TRUE) )
    df2 <- data.frame(row.names=(i + 1):(i + i), 
                      var1=sample(c(TRUE,FALSE), i, replace=TRUE),
                      var2=sample(1:10, i, replace=TRUE))
    tm1 <- system.time({
        df6 <- sapply(df2$var1, FUN=function(x) { x == df1$var1 })
        dimnames(df6) <- list(row.names(df1), row.names(df2))
    })
    rm(df6)
    tm2 <- system.time({
        cl <- makeCluster(getOption('cl.cores', detectCores()))
        tm3 <- system.time({
            df7 <- parSapply(cl, df1$var1, FUN=function(x, df2) { x == df2$var1 }, df2=df2)
            dimnames(df7) <- list(row.names(df1), row.names(df2))
        })
        stopCluster(cl)
    })
    rm(df7)
    results[[cnt]] <- c(apply=tm1, parallel.total=tm2, parallel.exec=tm3)
    setTxtProgressBar(pb, cnt)
}

toplot <- as.data.frame(results)[,c('apply.user.self','parallel.total.user.self',
                          'parallel.exec.user.self')]
toplot$size <- sizes
toplot <- melt(toplot, id='size')

ggplot(toplot, aes(x=size, y=value, colour=variable)) + geom_line() + 
    xlab('Vector Size') + ylab('Time (seconds)')

Ответы на вопрос(3)

Ваш ответ на вопрос