2014-05-23 26 views
1

我正在使用降雪進行並行計算。我總是隻在一臺機器上安裝多個CPU(> 20個內核)。我正在處理大量數據(> 20GB)。 sfExport()需要很長時間。什麼時候需要使用sfExport(R降雪包)

當我在我的筆記本電腦上運行我的測試代碼並檢查CPU使用情況時,有時也會在沒有sfExport()的情況下運行。

我的代碼的某些部分嵌套了sfLapply()函數。像:

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 GB的對象到所有羣集的工人,這將需要大量的時間和使用大量的內存。每個工作人員都會收到自己的20 GB對象的副本,因此您可能不得不減少工作人員的數量以減少總內存使用量,否則您的計算機可能會發生抖動,並且程序最終可能會死亡。在這種情況下,使用較少的工人可能運行得更快。當然,如果你的機器有512GB的內存,使用20個工人可能會很好,但是將這個對象發送給所有的工人還需要很長時間。

如果每個工作人員都需要一個特定的數據框或矩陣來執行輔助功能,那麼導出它可能是正確的。如果每個工作人員只需要部分對象,那麼您應該將其分解並僅發送每個工作人員所需的部分。關鍵是確定工作人員功能需要哪些數據,並只發送所需的數據。

如果即使您沒有導出對象,但是您可能會在函數閉包中捕獲該對象。下面是一個例子:

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

這工作正常,但變量「x」如何發送給羣集工作人員並不明顯。答案是,當sfLapply將任務發送給工作人員時,「x」與「worker」函數一起序列化,因爲「worker」在函數「fun」中定義。在這種情況下,通過sfExport將「x」輸出給工人是浪費時間。還要注意,雖然這種技術適用於sfLapply,但它不適用於像sfClusterApply和sfClusterApplyLB這樣的不像sfLapply那樣執行任務組塊的函數,儘管這只是一個問題,如果「x」非常大。

我不會再討論這個問題的更多細節,只是說當你的工作者函數被定義在另一個函數內時你應該非常小心。

相關問題