2013-06-28 9 views
5

Đó là các bước đầu tiên của tôi với tính toán song song trong R. Mã bên dưới dẫn đến lỗi sau. Tôi không biết gì, vì không có chức năng bí mật trong những gì tôi viết, ít nhất tôi đã không đặt nó một cách rõ ràng.vòng lặp foreach song song sản xuất lỗi mclapply

Lỗi:

Error in mclapply(argsList, FUN, mc.preschedule = preschedule, mc.set.seed = set.seed, : 
    (list) object cannot be coerced to type 'integer' 
Calls: %dopar% -> <Anonymous> -> mclapply 
Execution halted 

Code:

dist<-array(0, dim=c(320,500,25)) 

mc<-8 
cl<-makeCluster(mc) 
registerDoMC(cl) 
opts<-list(chunkSize=10) 

for(a in 1:25) { 
    dist[,,a]<-foreach(x=1:500, .combine='cbind', .options.mc=opts) %:% 
    foreach(y=1:320, .combine='c') %dopar% { 
     gcd.slc(crdsx[y,x], crdsy[y,x], lot[a,5], lot[a,4]) 
    } 
} 
stopCluster(cl) 

Trên một máy tính khác nhau, nó hoạt động độc đáo với

registerDoParallel(cl) 

thay vì

registerDoMC(cl) 
+1

bạn có thể thêm sessionInfo() vào OP không? –

+1

Khi bạn đăng ký một chương trình phụ trợ song song với 'registerDoMC', hàm' doMC' được đặt để thực hiện khi bạn gọi hàm '% dopar%'. 'doMC' bao gồm một cuộc gọi đến' mclapply', vì vậy đó là nơi nó xuất phát. – BenBarnes

Trả lời

9

Bạn nhận được lỗi đó vì registerDoMC mong đợi một đối số nguyên, không phải là đối tượng cụm, trong khi registerDoParallel mong đợi một số nguyên hoặc một đối tượng cụm. Về cơ bản, bạn cần quyết định sử dụng gói nào và không trộn chúng.

Nếu bạn sử dụng doMC, thì bạn không bao giờ tạo đối tượng cụm. Một tối thiểu doMC dụ trông giống như:

library(doMC) 
registerDoMC(3) 
foreach(i=1:10) %dopar% sqrt(i) 

Gói doParallel là một mashup của doMCdoSNOW gói, và do đó bạn không cần phải sử dụng đối tượng cluster. Chuyển đổi các ví dụ trước để doParallel rất đơn giản:

library(doParallel) 
registerDoParallel(3) 
foreach(i=1:10) %dopar% sqrt(i) 

Điều khó hiểu là trên Windows, doParallel sẽ thực sự tạo ra và sử dụng một đối tượng cụm đằng sau hậu trường, trong khi trên Linux và Mac OS X, nó không sử dụng một đối tượng cụm vì nó sử dụng mclapply giống như trong gói doMC. Tôi nghĩ rằng đó là thuận tiện, nhưng nó có thể là một nguồn gây nhầm lẫn.

+0

Cảm ơn bạn. Sau khi modyfying rất nhiều ví dụ từ các gói khác nhau, tôi đã được trái với registerDoMc (cluster) vào giữa đêm. Có lẽ sẽ không bao giờ hỏi câu hỏi này vào buổi sáng sau một ý nghĩ sắc bén ... Đặt một số nguyên làm đối số và chỉ dựa vào doMC thực sự là điều tôi đang tìm kiếm, cảm ơn bạn! – user2530062