2014-06-11 156 views
0

我已成功處理使用parLapply一個4芯計算機上的一些數據,使用如下面的碼:無法打開連接錯誤與parLapply

require("parallel") 
setwd("C:/...") 

file_summary<-read.table("file_summary",header=T,sep=" ",stringsAsFactors=F) 
new_filename<-sub(".asc",".dat",file_summary$filename) 

file_list<-list.files() 

myfunction <- function(k) { 

x<-M$x[k] 
y<-M$y[k] 

for (i in 1:length(file_summary[,1])) { 
    if (# logical condition on x and y) { 
    new_file<-new_filename[i] 
    new_data<-read.table(new_file,header=T,sep=" ") 
    eval<-matrix(,nrow=length(new_data$x),ncol=1) 

     for (j in 1:length(new_data$x)) { 
     eval[j]<-(new_data$x[j]-x)^2+(new_data$y[j]-y)^2 
    } 
    index<-which(eval == max(eval)) 
    out<-c(new_data$x[index],new_data$y[index],new_data$mean[index],new_data$S[index]) 
} 
rm(eval) 
gc() 
} 
return(out) 
} 

n_tasks <- length(M$x) 
n_cores <- 8 

Cl = makeCluster(n_cores, type = "PSOCK") 
clusterExport(Cl, "M") 
clusterExport(Cl, "file_summary") 
clusterExport(Cl, "new_filename") 
clusterExport(Cl, "file_list") 

Results <- parLapply(Cl, c(1:n_tasks), myfunction) 

stopCluster(Cl) 

和現在使用完全相同的代碼和相同的數據和目錄結構(即路徑),我試圖在8核心機器上運行分析以加速進一步加速。然而,在我第一次嘗試,我得到以下錯誤:

8 nodes produced errors; first error: cannot open the connection 

我試圖清除RAM位(非[R過程),看看它是否幫助,但它沒有。有什麼建議麼?

+0

愚蠢的問題,但你的機器有8個核心? –

+0

好吧,我連接到一臺遠程計算機來做到這一點,並通過檢查設備管理器顯示8 ...我也被負責人告知,前一陣子有8個內核。不過,我可能想再次與他們覈對。 – Neodyme

回答

1

我在「myfunction」中看到的可以生成「無法打開連接」錯誤的唯一操作是「read.table」。您可能需要調用之前函數read.table添加以下權利:

if (! file.exists(new_file)) 
    stop(paste(new_file, "does not exist")) 

這也可能是有用的檢查,工人有權讀取該文件:

if (file.access(new_file, mode=4) == -1) 
    stop(paste("no read permission on", new_file)) 

這似乎是值得的統治解決這些問題。

+0

第一個解決方案做到了 - 我的一些文件沒有正確複製到新機器...謝謝! – Neodyme

0

您需要將當前目錄作爲parLapply()中的參數傳遞給您的函數。裏面的功能myfunction你需要setwd()重置工作目錄:

myfunction = function(k, wd_) 
{ 
     setwd(wd_) 
     ... 
} 
... 
wd_ = getwd() 
Results <- parLapply(Cl, c(1:n_tasks), myfunction, wd_) 

注:確保R/R Studio/R Script全部不被防火牆阻止。