2015-09-08 2 views
1

J'ai joué avec le serveur rstudio sur un vieux portable avec linux mint (debian) installé.cas d'utilisation incorrecte de mclapply?

J'ai toujours couru sur les fenêtres, donc je ne l'ai jamais pris avantage de parallel ou multicore paquets, et mon but était d'apprendre rstudio server ainsi que R linux et comment le traitement multicœur pourrait accélérer mon processus.

Une utilisation principale de lapply que je l'utilise sur une base quotidienne ressemble à ceci:

f <- function(x) { 
    x1 <- data[1:50, x] 
    x2 <- data[51:100, x] 

    line <- c(paste0(mean(x1), " (", sd(x1), ")"), 
      paste0(mean(x2), " (", sd(x2), ")"), 
      t.test(x1, x2)$p.value) 
    return(line) 
} 

data <- data.frame(matrix(rnorm(2600, 85, 19), nrow=100, ncol=26)) 
names(data) <- letters 

do.call(rbind, lapply(letters, f)) 

microbenchmark(
    do.call(rbind, lapply(letters, f)) 
) 

temps médian est 21.8 millisecondes

Autre possibilité:

library(parallel) 
microbenchmark(
    do.call(rbind, mclapply(letters, f)) 
) 

temps médian est 120.9 millisecondes .

Pourquoi cette énorme différence?

La machine est un dinosaure à 2 cœurs. Est-ce que vous ne voyez pas d'avantages tant que vous ne travaillez pas avec des machines à quatre noyaux? Est-ce que mon cas d'utilisation (calculs de colonne d'un data.frame) est incorrect pour voir les avantages?

Merci!

Répondre

1

Vos données est à petit pour avoir un avantage contre les frais généraux, essayez

f <- function(x) { 
    x1 <- data[1:50000, x] 
    x2 <- data[50001:100000, x] 

    line <- c(paste0(mean(x1), " (", sd(x1), ")"), 
      paste0(mean(x2), " (", sd(x2), ")"), 
      t.test(x1, x2)$p.value) 
    return(line) 
} 

data <- data.frame(matrix(rnorm(2600, 85, 19), nrow=100000, ncol=26)) 

au lieu et vérifier le résultat. Votre exemple a pris mon ordinateur portable 7 et 17 milisecondes médian, mais mon plus grand exemple change cela en 120 et 80. Donc, à mon avis, c'est (pas seulement) le nombre de cœurs, mais plus la taille de vos données dans ce cas.

+0

Je viens d'essayer ceci et sur mon processeur 2-core. L'écart s'est fermé d'environ 4 dixièmes de milliseconde, donc rien de proche du changement que vous avez reçu, mais c'était au moins dans la bonne direction. J'ai décidé de filtrer le système dans les deux sens en doublant également le nombre de variables à calculer (jusqu'à 52), à quel point j'ai finalement trouvé que mclapply avait un temps de calcul médian plus rapide. Merci! –