2014-05-23 6 views
1

나는 폭설을 병렬 컴퓨팅에 사용하고 있습니다. 나는 항상 하나의 머신에서만 여러 개의 CPU (20 개 이상의 코어)를 사용하고 있습니다. 많은 양의 데이터를 처리하고 있습니다 (> 20GB). sfExport()는 매우 오래 걸립니다.언제 sfExport (R Snowfall 패키지)를 사용해야합니까?

내 랩톱에서 테스트 코드를 실행하고 CPU 사용량을 확인하면 sfExport() 없이도 작동합니다.

내 코드 일부는 중첩 된 sfLapply() 함수입니다. Like :

func2 <- function(c,d, ...) {  

    result <- 
    list(x = c+d, 
     y = .., 
     ... 
     ) 

    return(result) 

} 

func1 <- function(x, a, b, c, ...) { 

    library(snowfall) 
    d <- a+b 

    result <- sfLapply(as.list(b$row), func2, c, d, ...) 

    return(result) 
} 

result <- sfLapply(as.list(data.table$row), func1, a, b, c, ..) 

언제 데이터를 모든 CPU로 정말로 내 보내야합니까?

감사와 안부 니코

답변

1

당신이 많은 시간을 가지고 많은 메모리를 사용하는 클러스터 근로자 모두에게 20 기가 바이트 객체를 수출하는 경우. 각 작업자는 20GB 개체의 복사본을 받게되므로 총 메모리 사용량을 줄이기 위해 작업자 수를 줄여야 할 수 있습니다. 그렇지 않으면 컴퓨터가 스 래싱을 시작하여 결국 프로그램이 종료 될 수 있습니다. 이 경우, 더 적은 수의 근로자를 사용하는 것이 훨씬 빨리 실행될 수 있습니다. 물론 컴퓨터에 512GB RAM이있는 경우 20 명의 직원을 사용하면 문제가되지 않지만 모든 직원에게 해당 개체를 보내려면 시간이 오래 걸립니다.

작업자 함수를 실행하기 위해 각 작업자가 특정 데이터 프레임이나 행렬을 필요로하는 경우 해당 작업을 내보내는 것이 올바른 일일 수 있습니다. 각 작업자가 개체의 일부만 필요로하는 경우에는 작업자를 분할하여 각 작업자가 필요로하는 부분 만 보냅니다. 핵심은 작업자 기능에서 필요한 데이터를 정확히 판별하고 필요한 것만 송신하는 것입니다.

당신이 그것을 내 보내지 않아도 마술처럼 보이게된다면, 당신은 그 객체를 함수 클로저로 캡쳐하고있을 것입니다. 다음은 예입니다 :

library (snowfall) 
sfInit (parallel=TRUE , cpus=4) 
fun <- function() { 
    x <- 100 
    worker <- function(n) x * n 
    sfLapply(1:1000, worker) 
} 
r <- fun() 

이 잘 작동하지만 변수가 "X"클러스터 노동자로 전송됩니다 분명 아니다. 그 대답은 "worker"가 "fun"함수 내에 정의되어 있기 때문에 sfLapply가 작업자에게 작업을 보낼 때 "x"가 "worker"함수와 함께 직렬화된다는 것입니다. 이 경우 sfExport를 통해 "x"를 근로자에게 수출하는 것은 시간 낭비입니다. 또한이 기술은 sfLapply와 잘 작동하지만 sfLapply와 같은 작업 청크를 수행하지 않는 sfClusterApply 및 sfClusterApplyLB와 같은 기능에서는 제대로 작동하지 않지만 "x"가 매우 큰 경우에만 문제가됩니다.

작업자 기능이 다른 기능에 정의되어있을 때 매우 신중해야한다는 것을 제외하고는이 주제에 대해 더 이상 자세히 설명하지 않겠습니다.