2017-07-23 2 views
0

J'ai une fonction appelée DTW dans un ensemble de mesures de similarité. Il prend deux matrices ou une trame de données comme arguments et renvoie la distance de distorsion temporelle dynamique. Ces trames de données sont les longitudes et les latitudes de la trajectoire. Mon programme ressemble à ceci et toutes les trames de données comme DF1, DF2, DF3, etc. sont disponibles:programmation parallèle pour une fonction prenant deux arguments d'une liste de trames de données en utilisant R

distance <- function(arg1,arg2) { 
    DTW(arg1, arg2) 
} 
for(i in 1:length(LIST)){ 
    for(j in 1:length(LIST)){ 
    a <- get(paste0("df",i)) 
    b <- get(paste0("df",j)) 
    ddist[i,j] <- distance(a,b) 
    print(ddist) 
    } 
} 

Je fais une ddist de matrice dans laquelle toutes les valeurs sont insérées retournées par la fonction de la distance. Le programme fonctionne bien. Je veux le faire rapidement en utilisant la programmation parallèle comme la fonction parapply ou parlapply.

+2

Si vous voulez faire cela en parallèle, vous devez le redessiner selon les règles de l'art. Votre utilisation de get est un non-go et ne fonctionnera pas bien en parallèle. Ces data.frames devraient être ensemble dans une liste. Quand vous aurez résolu cela, je vous encouragerai à étudier les vignettes du paquet foreach. – Roland

+0

Ok Roland. Je vais l'étudier. Merci. – umair

+0

@Roland Que diriez-vous de parLappy pr parApply pour la programmation parallèle? – umair

Répondre

0

Voici une méthode simple pour vous donner une idée de la façon de le rendre parallèle

k<-length(LIST) 
ddist<-matrix(0,k,k) 
library("doParallel") 
cl<-makeCluster(4,outfile='') 
registerDoParallel(cl) 
for(i in 1:k) { 
    a <- get(paste0("df",i)) 
    ddist[i,]=foreach(j = 1:k , .combine='cbind' ,.export=paste0("df",1:k)) %dopar% { 
    b <- get(paste0("df",j)) 
    distance(a,b) 
    } 
} 

stopCluster(cl) 

Cela dit, les choses à évaluer

  1. si la fonction de la distance prend plus de 2 secondes, alors utilisez uniquement en parallèle
  2. df1, df2 etc peut-être pas une bonne idée, stocker chaque dataframe comme df [[1]], df [[2]]. Mieux que d'utiliser la fonction get
  3. si la longueur (k) est très grande, alors le temps nécessaire pour de transférer les fichiers exportés df1, df2 etc est assez long, donc essayez d'atteindre le point de performance avec diverses itérations
  4. vous pouvez voir l'option de data.table où il y a inplace modifier, utiliser ce lieu du ddist comme il peut être plus rapide
  5. Si ce code est appelé dans une fonction, alors vous pourriez aussi avoir besoin de exporter la fonction ddist, comme .export=c(ddist,paste0("df",1:k))
  6. Modifier le "4" dans makeCluster pour choisir les noyaux nt, comme un thumbrule, gardez-le comme detectCores()-1