2011-10-26 18 views
7

Tôi đang cố gắng để làm chủ setTimeLimit() trong R và kinh nghiệm của tôi đã dẫn đến một số câu hỏi liên quan, vì vậy có thể câu hỏi cơ bản là: làm thế nào điều này thực sự làm việc? (. Tôi đã được nhìn evalWithTimeout() từ R.utils là tốt, và nó có thể phù hợp với mục đích của tôi tốt hơn một chút, nhưng nó được xây dựng trên chức năng này)Làm thế nào để setTimeLimit hoạt động trong R?

Dưới đây là những điều quan trọng tôi đang cố gắng tìm ra:

  1. Làm cách nào để theo dõi thời gian đã trôi qua? I E. nó dường như được đưa vào điều khiển luồng, vậy làm thế nào nó làm được điều đó? Có thể có các quy trình "nền" là tuyệt vời và có thể được sử dụng để báo cáo trạng thái, kiểm tra điểm, v.v.

  2. Tôi có thể xác định khoảng thời gian còn lại cho đến khi nó được kích hoạt không? Tôi nhận ra rằng tôi có thể quấn nó và lưu trữ, ở đâu đó, thời gian CPU đã trôi qua & được tiêu thụ tại điểm yêu cầu (tức là đầu ra của proc.time()). Nhưng, chức năng này đã được lưu trữ ở đâu đó và tôi muốn biết ở đâu, hoặc ít nhất là làm thế nào để xác định thời gian còn lại.

  3. Nó có thể được thực hiện để làm điều gì đó hữu ích nếu bảng điều khiển R không hoạt động? Có thể theo dõi elapsed.time()cpu.time() rất hữu ích. Tôi muốn có thể giám sát khi R không hoạt động, nhưng có vẻ như từ việc nhét nó đòi hỏi một lệnh phải được gửi hoặc hoàn thành. Hơn nữa, chỉ cần xuất một lỗi không kích hoạt một hành động tiếp theo. (Có thể tôi cần chú ý nhiều hơn đến evalWithTimeout.)

  4. Thông tin trợ giúp nói rằng nó có thể áp dụng được với C hoặc Fortran, nhưng không đưa ra ví dụ. Bất kỳ đề xuất về cách này nên được thực hiện?

+1

Bao nhiêu kinh nghiệm nào bạn có với lập trình đa luồng? Khi tôi nhớ lại, điều này chỉ đơn giản là móc vào một cơ chế gọi lại, và do đó được đánh thức mỗi vài chu trình xử lý. Có ví dụ để sử dụng ví dụ này để cập nhật lời nhắc của phiên R terminal của bạn với thời gian hiện tại --- đó là một ví dụ ngớ ngẩn cho mỗi lần xem nhưng một minh họa hữu ích. –

+0

Tôi có thể làm việc với lập trình đa luồng. Tôi cho rằng đó là một cuộc gọi lại, nhưng đã không cố gắng ghim nó xuống. Điều thú vị là nó không xuất hiện trong 'getTaskCallbackNames()' hoặc 'taskCallbackManager()'. – Iterator

Trả lời

3

Để chứng minh rằng setTimeLimit không hoạt động trong một hàm C gọi:

rfunction <- function(){ 
    repeat{ 
     x <- rnorm(100); 
    } 
} 

cfunction <- function(){ 
    x <- eigen(matrix(rnorm(1e6), 1e3)); 
} 

setTimeLimit(3); 
system.time(try(rfunction(), silent=TRUE)) 
system.time(try(cfunction(), silent=TRUE)) 
Các vấn đề liên quan