2012-06-08 41 views
12

Đối với một số nỗ lực tôi đang tham gia vào lúc này, tôi đang chạy bộ dữ liệu lớn với nhiều kết hợp thông số thông qua một loạt các chức năng. Các hàm có một trình bao bọc (vì vậy tôi có thể mclapply) để dễ vận hành trên một cụm. Tuy nhiên, tôi gặp phải hai thách thức lớn.Làm cách nào để tôi hết thời gian khi mục danh sách bị lỗi hoặc mất quá nhiều thời gian?

a) Các kết hợp thông số của tôi lớn (suy nghĩ 20k đến 100k). Đôi khi các kết hợp cụ thể sẽ không thành công (ví dụ: tỷ lệ sống quá cao và tỷ lệ tử vong quá thấp để mô hình không bao giờ hội tụ như một kịch bản giả định). Thật khó cho tôi để trêu chọc trước thời điểm chính xác những kết hợp nào sẽ thất bại (cuộc sống sẽ dễ dàng hơn nếu tôi có thể làm điều đó). Nhưng đối với tôi bây giờ có loại thiết lập:

failsafe <- failwith(NULL, my_wrapper_function) 
# This is what I run 
# Note that input_variables contains a list of variables in each list item 
results <- mclapply(input_variables, failsafe, mc.cores = 72) 
# On my local dual core mac, I can't do this so the equivalent would be: 
results <- llply(input_variables, failsafe, .progress = 'text') 

Bộ xương cho chức năng bao bọc của tôi trông như thế này:

my_wrapper_function <- function(tlist) { 
    run <- tryCatch(my_model(tlist$a, tlist$b, tlist$sA, tlist$Fec, m = NULL) , error=function(e) NULL) 
... 
return(run) 
} 

Đây có phải là cách tiếp cận hiệu quả nhất? Nếu vì một lý do nào đó, một sự kết hợp đặc biệt của các biến sẽ làm hỏng mô hình, tôi cần nó để trả về một số NULL và tiếp tục với phần còn lại. Tuy nhiên, tôi vẫn có vấn đề mà điều này không thành công ít hơn.

b) Đôi khi một sự kết hợp nhất định đầu vào không làm hỏng mô hình nhưng mất quá nhiều thời gian để hội tụ. Tôi thiết lập một giới hạn về thời gian tính toán trên cụm của tôi (nói 6 giờ) vì vậy tôi không lãng phí nguồn lực của tôi vào một cái gì đó bị mắc kẹt. Làm thế nào tôi có thể bao gồm một thời gian chờ như vậy mà nếu một cuộc gọi chức năng mất nhiều hơn x thời gian trên một mục danh sách duy nhất, nó nên di chuyển trên? Tính toán thời gian chi tiêu là tầm thường nhưng một mô phỏng giữa chức năng không thể bị gián đoạn để kiểm tra thời gian, phải không?

Bất kỳ ý tưởng, giải pháp hoặc thủ thuật nào được đánh giá cao!

+1

bạn đã xem xét setTimeLimit() hoặc http://www.inside-r.org/node/81211 chưa? Có thể là những gì bạn cần. – frankc

Trả lời

12

Bạn cũng có thể quản lý thời gian chờ thoát ra bằng cách kết hợp tryCatch()evalWithTimeout() từ gói R.utils. See also this post, hiển thị mã tương tự giải nén chi tiết hơn một chút.

require(R.utils) 

myFun <- function(x) {Sys.sleep(x); x^2} 

## evalWithTimeout() times out evaluation after 3.1 seconds, and then 
## tryCatch() handles the resulting error (of class "TimeoutException") with 
## grace and aplomb. 
myWrapperFunction <- function(i) { 
    tryCatch(expr = evalWithTimeout(myFun(i), timeout = 3.1), 
      TimeoutException = function(ex) "TimedOut") 
} 

sapply(1:5, myWrapperFunction) 
# [1] "1"  "4"  "9"  "TimedOut" "TimedOut" 
+0

Cảm ơn bạn rất nhiều Josh. Tôi đang thử nghiệm này trên cụm của tôi bây giờ (hoạt động tốt tại địa phương nhưng không chắc chắn thời gian chờ chơi độc đáo trên một cụm). – Maiasaura

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