2015-02-13 12 views
11

Đây là mã của tôi. Nội dung bên trong vòng lặp có ý nghĩa.

 library(foreach) 
     library(doParallel) 
     cl <- makeCluster(7) 
     registerDoParallel(cl) 

     elasticitylist = foreach(i=1:nhousehold) %dopar% { 

      pricedraws = out$betadraw[i,12,] 
      elasticitydraws[,,i]= probarray[,,i] %*% diag(pricedraws) 
      elasticitydraws[,,i] = elasticitydraws[,,i] * as.vector(medianpricemat) 

     } 

tôi tiếp tục nhận được lỗi này:

Error in serialize(data, node$con) : error writing to connection 

Tôi biết tôi có đủ lõi (có 20). Bất cứ ai có thể giúp đỡ với điều này? Có vẻ như câu trả lời là hư không được tìm thấy trong tài liệu!

Khi tôi chạy ps -ef| grep user trên máy chủ Unix của tôi, tôi nhận được:

/apps/R.3.1.2/lib64/R/bin/exec/R --slave --no-restore -e parallel:::.slaveRSOCK() --args MASTER=localhost PORT=11025 OUT=/dev/null TIMEOUT=2592000 METHODS=TRUE XDR=TRUE 
+0

Mã cơ bản giống với bạn ngoại trừ một số dữ liệu được tạo tay hoạt động cho tôi. Nếu bạn làm cho ví dụ tái sản xuất tôi có thể có một cái nhìn khác. Bạn đang sử dụng cấu trúc dữ liệu bất thường? – kasterma

+0

Dữ liệu rất lớn, nhưng chúng không phải là bất thường. Tôi nghĩ rằng $ betadraw là một lát ma trận mặc dù, có thể đó là nó? – robertevansanders

Trả lời

7

Các chức năng serializeunserialize được gọi là bởi quá trình tổng thể để giao tiếp với người lao động khi sử dụng một cụm socket. Nếu bạn gặp lỗi từ một trong các hàm đó, điều đó thường có nghĩa là ít nhất một trong số các nhân viên đã chết. Trên một máy Linux, nó có thể đã chết vì máy gần hết bộ nhớ, vì vậy kẻ giết người đã quyết định giết nó, nhưng có nhiều khả năng khác.

Tôi khuyên bạn nên sử dụng tùy chọn makeCluster outfile="" khi tạo đối tượng cụm sao cho đầu ra từ công nhân được hiển thị. Nếu bạn may mắn, bạn sẽ nhận được một thông báo lỗi từ một nhân viên trước khi nó chết sẽ giúp bạn giải quyết vấn đề.

+2

Bạn tôi nói đó là bởi vì khi bạn cố gắng để có đầu ra quá cao của bộ nhớ, nó lỗi thường regrdless bao nhiêu RAM bạn có. Bạn có biết cách này không? – robertevansanders

2

Tôi gặp vấn đề tương tự, khi tôi cố gắng sử dụng tất cả 8 lõi máy của mình. Khi tôi để lại một mở, sau đó vấn đề đã biến mất. Tôi tin rằng hệ thống yêu cầu 1 lõi cho các nhiệm vụ dịch vụ còn mở, nếu không bạn sẽ gặp lỗi:

library(doParallel) 
#Find out how many cores are available (if you don't already know) 
cores<-detectCores() 
#Create cluster with desired number of cores, leave one open for the machine   
#core processes 
cl <- makeCluster(cores[1]-1) 
#Register cluster 
registerDoParallel(cl) 
+1

Tôi không nghĩ rằng đó là số lượng tuyệt đối của lõi gây ra lỗi; Tôi đã nhận thấy rằng, khi tôi làm việc trên các tập tin lớn (4 + Gb) và sử dụng "doParallel", tôi cần phải giảm số lượng lõi được sử dụng nếu không tôi chạy thấp trên bộ nhớ. Vì vậy, vấn đề có thể là quá nhiều lõi sử dụng quá nhiều bộ nhớ mà ném lỗi. Bất kỳ ai có nhiều kiến ​​thức hơn đều có thể xác nhận/bác bỏ/giải thích điều này? –

+0

có khả năng là 'doParallel' sao chép tất cả dữ liệu từ bản gốc đến các nô lệ. do đó, nhu cầu bộ nhớ sẽ mở rộng tuyến tính theo số lượng lõi. các bậc thầy và nô lệ đều rút ra từ cùng một nhóm bộ nhớ, do đó không khó để vi phạm giới hạn bộ nhớ. –

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