2017-09-12 2 views
1

아래 코드를 R로 병렬 처리하고 싶습니다. for 중첩 된 for 루프입니다. 사용 할 수있다 ( 중첩 된 for 루프를 병렬 처리하십시오.

Error in { : task 1 failed - "invalid 'type' (list) of argument"

이 코드를 병렬화하는 더 좋은 방법이 있나요 :

for (i in 1:nrow(my_dataset_preprocessed)){ 
    for (j in 1:ncol(my_dataset_preprocessed)){ 
     my_dataset_preprocessed[i,j] = min(my_dataset_preprocessed[i,j], 0.1) 
    } 
} 

나는

library(foreach) 
library(doParallel) 
registerDoParallel(detectCores()) 
clusterExport(cl, "my_dataset") 

threshold_par <- function (X) { 
    co <- foreach(i=1:nrow(X)) %:% 
       foreach (j=1:ncol(X)) %dopar% { 
        co = min(X[i,j], 0.1) 
       } 
    matrix(unlist(co), ncol=ncol(X)) 
} 

system.time(threshold_par(my_dataset)) 

doParallel

사용하여 아래의 코드를 시도하고있다 그러나 나는 다음과 같은 오류를 얻고있다 parLapply)? 그렇지 않은 경우 위 코드를 어떻게 수정합니까?

+0

를 제거하는 경우는 일 다음 내가 생각하는'lapply (my_dataset_preprocessed, 기능 (X) PMIN (X, 0.1))'할 간단 할 것입니다. – Benjamin

+2

데이터가 매트릭스 인 경우, 다음과 같이 작동해야합니다 :'my_dataset [my_dataset> 0.1] <- 0.1' – emilliman5

답변

0

cl을 신고하지 않았습니다. 당신이 clusterExport(cl, "my_dataset")

library(foreach) 
library(doParallel)  
registerDoParallel(detectCores()) 
getDoParWorkers() 
# [1] 8 

threshold_par <- function (X) { 
    co <- foreach(i=1:nrow(X)) %:% 
       foreach (j=1:ncol(X)) %dopar% { 
        co = min(X[i,j], 0.1) 
       } 
    matrix(unlist(co), ncol=ncol(X)) 
} 

test <- matrix(1:4, ncol=2) 
system.time(threshold_par(test)) 
#  user system elapsed 
#  0.01 0.00 0.02 
+0

나는 전에 cl 선언을했는데, 그건 문제가되지 않습니다. 해당 줄을 제거하더라도 동일한 오류가 발생합니다. –

+0

Ok. btw, 나는 새로운 R 세션을 시작했고, 에러없이 다시 작동했다. 왜 그런지 확실하지 않다. '% dopar % '대신에'% do %'를 사용하여 동일한 코드를 시도해 주시겠습니까? – CPak

+0

% do % 내게 같은 오류가 발생합니다. 나는 당신의 행렬을 시험해 보았고 제대로 돌아갔습니다. 그래서 문제는 그 구조에 있습니다. \t 5 정지 (simpleError (MSG, 호출 = EXPR)) \t 4 전자 $ 재미 (OBJ, 대체 (예), parent.frame(), 전자 $ 데이터) \t 3 : 다음은 오류의 역 추적입니다 foreach는 (ⅰ = 1 : nrow (X)) % %의 foreach는 (j = 1을 NcoI (X)) % dopar % { \t \t CO = 분 (X [I, J, 0.1) \t} \t 2 threshold_par (테스트) \t 1 system.time (threshold_par (테스트)) –

관련 문제