2017-08-24 78 views
0
library(doParallel) 
library(RMySQL) 

no_cores <- as.integer(system('getconf _NPROCESSORS_ONLN', intern = TRUE)) - 1 
cluster <- makeCluster(no_cores) 
registerDoParallel(cl) 

clusterEvalQ(
    cluster, 
    mysql <- RMySQL::dbConnect(...) 
    } 
) 

r <- foreach(i = 1:50, .verbose = TRUE) %dopar% { dbGetQuery(mysql, 'show tables;')} 

no variables are automatically exported 

沒有錯誤,沒有抱怨。沒什麼,它只是凍結。我可以啓動並使用沒有數據庫連接的集羣。foreach與數據庫連接凍結,沒有錯誤,永遠

想法?

回答

3

它什麼時候掛?當致電clusterEvalQ或foreach循環?

我有幾個建議:

  • 使用outfile=""創建羣集時得到調試輸出;
  • 初始化羣集時加載RMySQL;
  • 返回NULLclusterEvalQ避免序列化連接對象;
  • 確保您致電registerDoParallel,以便任務不在本地執行。

下面是一個使用這些建議的測試:

library(doParallel) 
cl <- makePSOCKcluster(3, outfile="") 
registerDoParallel(cl) 

clusterEvalQ(cl, { 
    library(RMySQL) 
    mysql <- dbConnect(MySQL(), user='root', 
        password='notmypasswd', dbname='mysql') 
    NULL 
}) 

r <- 
    foreach(i=1:50, .verbose=TRUE) %dopar% { 
    dbGetQuery(mysql, 'show tables;') 
    } 

這個測試對我的作品。當我運行它,我看到這樣的消息:

no variables are automatically exported 
numValues: 50, numResults: 0, stopped: TRUE 
got results for task 1 
numValues: 50, numResults: 1, stopped: TRUE 
returning status FALSE 
got results for task 2 

如果你只看到:

no variables are automatically exported 

,然後將其掛起,那麼工人們大概掛試圖執行使用數據庫連接的查詢。這聽起來像是MySQL的問題,但我不是MySQL專家。

+0

謝謝Steve,這絕對是最後一部分。我什麼也沒得到,它只是掛起,所以也許是數據庫連接失敗。我只是希望有一些輸出。我離開它約20分鐘,它仍然在那裏卡住,沒有錯誤信息或任何東西。我也忽略了在我的例子中添加'registerDoParallel',但它在我的實際中。我會嘗試你的建議,並讓你知道他們是否有任何工作。感謝您的關注! –

+0

您是否可以擴展一下「避免序列化連接對象」的含義? –

+1

@BrandonBertelsen在我的例子中,如果我在調用'clusterEvalQ'時沒有包含'NULL',它會嘗試返回由工作人員創建的連接對象列表。由於數據庫連接對象包含套接字連接,因此會導致序列化錯誤。我不認爲這會造成任何實際問題,但這令人不安。 –