2016-07-12 30 views
13

Tôi có một vòng lặp for có nghĩa là một cái gì đó như thế này:chạy một vòng lặp for song song trong R

for (i=1:150000) { 
    tempMatrix = {} 
    tempMatrix = functionThatDoesSomething() #calling a function 
    finalMatrix = cbind(finalMatrix, tempMatrix) 

} 

Ông có thể cho tôi biết làm thế nào để thực hiện song song này?

Tôi đã thử điều này dựa trên một ví dụ trực tuyến, nhưng tôi không chắc liệu cú pháp có đúng hay không. Nó cũng không làm tăng tốc độ nhiều.

finalMatrix = foreach(i=1:150000, .combine=cbind) %dopar% { 
    tempMatrix = {} 
    tempMatrix = functionThatDoesSomething() #calling a function 

    cbind(finalMatrix, tempMatrix) 

} 
+0

điều Chạy song song đòi hỏi khá nhiều chi phí. Bạn sẽ chỉ nhận được một tốc độ đáng kể lên nếu 'functionThatDoesSomething' mất đủ thời gian cho các chi phí để có giá trị nó. – Gregor

+1

Tôi nghĩ rằng còn có rất nhiều công việc mà bạn cần phải làm trước khi bài đăng này đủ điều kiện. Tra cứu các gói 'parallel' và' doParallel', ví dụ ... – gregmacfarlane

+0

Bạn không cần điều này - 'cbind (finalMatrix, tempMatrix)' - nếu bạn đang sử dụng đối số '.combine', chỉ cần trả về hàm đầu ra. – nrussell

Trả lời

18

Cảm ơn phản hồi của bạn. Tôi đã tra cứu parallel sau khi tôi đăng câu hỏi này.

Cuối cùng sau một vài lần thử, tôi đã chạy nó. Tôi đã thêm đoạn code dưới đây trong trường hợp nó rất hữu ích cho người khác

library(foreach) 
library(doParallel) 

#setup parallel backend to use many processors 
cores=detectCores() 
cl <- makeCluster(cores[1]-1) #not to overload your computer 
registerDoParallel(cl) 

finalMatrix <- foreach(i=1:150000, .combine=cbind) %dopar% { 
    tempMatrix = functionThatDoesSomething() #calling a function 
    #do other things if you want 

    tempMatrix #Equivalent to finalMatrix = cbind(finalMatrix, tempMatrix) 
} 
#stop cluster 
stopCluster(cl) 

Lưu ý - Tôi phải thêm một lưu ý rằng nếu người dùng phân bổ quá nhiều quy trình, sau đó người dùng có thể nhận được lỗi này: Error in serialize(data, node$con) : error writing to connection

Note - Nếu .combine trong tuyên bố foreachrbind, thì đối tượng cuối cùng được trả về sẽ được tạo bằng cách thêm đầu ra của mỗi hàng vòng-khôn ngoan.

Hy vọng điều này hữu ích cho những người thử xử lý song song trong R lần đầu tiên như tôi.

Tài liệu tham khảo: http://www.r-bloggers.com/parallel-r-loops-for-windows-and-linux/ https://beckmw.wordpress.com/2014/01/21/a-brief-foray-into-parallel-processing-with-r/

Các vấn đề liên quan