2016-09-29 2 views
2

이것은 아주 간단한 예입니다.R : foreach에서 데이터 프레임을 분할하는 방법 % dopar %

df = c("already ","miss you","haters","she's cool") 
df = data.frame(df) 

library(doParallel) 
cl = makeCluster(4) 
registerDoParallel(cl)  
foreach(i = df[1:4,1], .combine = rbind, .packages='tm') %dopar% classification(i) 
stopCluster(cl) 

실제로 n = 400000 행의 데이터 프레임이 있습니다. 한 단계에서 각 클러스터에 대해 nrow/ncluster 데이터를 보내는 방법을 모르겠습니까?

라이브러리 (itertools)의 isplitRows를 사용해 보았는데 성공하지 못했습니다.

답변

1

인덱스로 작업하여 데이터의 하위 집합을 만들어야합니다.

foreach(i = nrow(df), .combine = rbind, .packages='tm') %dopar% { 
    tmp <- df[,i] 
    classification(tmp) 
} 

각 반복마다 data.frame 행을 사용합니다.

또한 foreach 루프의 결과가 새 변수에 기록됩니다. 따라서, 당신은 다음과 같이 할당한다 : 여기 Aproach 1에 제안 된 splitmclapply의 조합을 사용하여

res <- foreach(i = 1:10, .combine = c, ....) %dopar% { 
    # things you want to do 
    x <- someFancyFunction() 

    # the las value will be returned and combined by the .combine function 
    x 
} 
+0

제안 해 주셔서 감사합니다. –

0

내 솔루션 :

n = 8 #number of cluster 
library(foreach) 
library(doParallel) 
cl = makeCluster(n) 
registerDoParallel(cl) 

z = nrow(df) 
y = floor(z/n) 
x = nrow(df)%%n 

ris = foreach(i = split(df[1:(z-x),],rep(1:n,each=y)), .combine = rbind, .packages='tm') %dopar% someFancyFunction(i) 

stopCluster(cl) 

#sequential 
if (x !=0) 
    ris = rbind(ris,someFancyFunction(df[(z-x+1):z,1])) 

참고 : "x"는 제로, 행의 나머지 부분을 넣어 기능 분할 (Z-(없는 경우 때문에 나는, 마지막에 연속 esecution를 사용 zx))를 입력하고 결과의 순서를 변경하십시오.

관련 문제