2015-01-23 2 views
1

두 개의 데이터 세트 (행과 열의 수가 같음)를 가지고 있고 내가 작성한 코드를 실행하려는 경우 순차 실행 또는 병렬 프로그래밍으로 진행하는 두 가지 옵션이 분명히 있습니다.R에서 어떻게 병렬 처리를 수행 할 수 있습니까?

이제 내가 작성한 알고리즘 (코드)은 큰 것이며 여러 for 루프로 구성됩니다. 두 가지 모두에 직접 사용할 수있는 방법이 있습니까, 아니면 어떤 방식 으로든 코드를 변형해야합니까? 머리가 멋질 것입니다.

+1

데이터 세트를 추가 (샘플) 할 수 있습니까? – nrussell

답변

0

질문에 대답하십시오 : 병렬로 두 개의 데이터 세트에서 실행되도록 코드를 변환 할 필요는 없습니다.

  1. 당신은 순차적으로 실행할 수있는 코드를 가지고 있지만 동시에 그것을하고 싶습니다

    일반적으로 두 가지 방법으로 발생하는 병렬 처리의 필요성은 (대부분의 사용자에게, 나는 상상).

  2. 대용량 데이터 집합에서 실행하는 데 너무 오래 걸리는 기능이 있으며 속도를 높이려면 병렬로 실행하고 싶습니다.
  3. 첫 번째 경우를 들어

, 당신은 단지 그것을 위해 설계 라이브러리 중 하나를 사용하여 병렬로 실행할 수, 아무것도 할 필요가, 아니면 그냥 같은 컴퓨터에 R의 두 인스턴스를 실행하고이를 실행되지 않습니다 코드가 있지만 각각의 데이터 세트가 다릅니다. 거기에있는 루프의 수는 중요하지 않으며 데이터 세트의 열에 동일한 수의 행을 가질 필요조차 없습니다. 순차적으로 잘 실행되면 병렬 체인간에 종속성이 없으므로 아무런 문제가 없음을 의미합니다. 질문이 첫 번째 경우에 해당하므로 병렬로 실행할 수 있습니다.

두 번째 사례가있는 경우 데이터 집합을 여러 조각으로 나눠서 (각 조각을 순차적으로 실행할 수 있음) 첫 번째 사례로 전환 한 다음 병렬로 실행할 수 있습니다. 이것은 말하기가 쉽지 않으며 항상 가능하지는 않습니다. 또한 모든 기능에 run.in.parallel=TRUE 옵션이있는 것은 아닙니다. 데이터를 분리하는 방법이 항상 명확하지는 않으며 항상 가능하지 않습니다.

그래서 이미 함수를 작성하고 데이터를 분할하여 대부분의 작업을 완료했습니다. 결과는 두 요소, 체인의 결과를 각각 함유리스트 것이다

library(doParallel) 
cl <- makeCluster(2) # for 2 processors, i.e. 2 parallel chains 
registerDoParallel(cl) 

datalist <- list(mydataset1 , mydataset2) 

# now start the chains 
nchains <- 2 # for two processors 

results_list <- foreach(i=1:nchains , 
       .packages = c('packages_you_need')) %dopar% { 
    result <- find.string(datalist[[i]]) 
    return(result) } 

: 여기 개의 데이터 세트에 하나 개의 기능으로 병렬 처리를 수행하는 일반적인 방법이다. 원하는대로 조합하거나 .combine 기능을 사용할 수 있습니다. 자세한 내용은 foreach 도움말을 참조하십시오.

위에서 설명한 숫자 1과 같은 대소 문자를 사용할 때마다이 코드를 사용할 수 있습니다. 대부분의 경우 숫자 2와 같은 경우에도 사용할 수 있습니다. 데이터를 나누는 방법에 대해 생각하고 결과를 결합하는 데 시간을 할애해야합니다. 그것을 "병렬 래퍼"라고 생각하십시오. Windows, GNU/Linux 및 Mac OS에서 작동해야하지만 모두 테스트하지는 않았습니다.

빠른 속도 향상이 필요할 때마다이 스크립트를 편리하게 보관하지만 항상 순차적으로 실행할 수있는 코드를 작성하여 시작합니다. 평행하게 생각하면 내 두뇌가 아플거야.

+0

감사합니다. 하지만이 프로그램이 직접 실행되거나 병렬 처리를 위해 원래 함수를 수정해야합니까? – Qirohchan

+0

직접 실행해야합니다. 함수가 두 개의 데이터 세트에서만 실행되도록하려면 병렬로 변경할 필요가 없습니다. R의 두 인스턴스를 병렬로 실행하는 것과 같습니다. 이를 위해 기능을 변경할 필요가 없습니다. 하나의 데이터 세트가 주어지면 자동으로 병렬로 실행되는 함수를 원하면 다른 이야기입니다. 그런 다음 함수에 데이터 집합을 분할하는 방법 등을 알려줘야합니다. 경우가 간단합니다. 당신은 하나의 기능을 가지고 있으며 그것을 두 번 실행하려고합니다. 따라서 변경할 필요가 없습니다. – dwcoder

+0

나는 당신의 전체적인 질문에 대답하지 않은 것을 알기 위해 나의 대답을 업데이트 할 것입니다! – dwcoder

관련 문제