2012-05-27 39 views
8

Có cách nào trong Haskell (sử dụng GHC nếu nó quan trọng, đối với mã cần chạy trên Linux và Windows) để thực hiện tính toán bị ràng buộc? Tức là, "tính toán kết quả của hàm này nếu nó khả thi để làm như vậy, nhưng nếu cố gắng sử dụng nhiều hơn chu kỳ CPU X, không gian ngăn xếp Y hoặc khoảng trống Z, và vẫn chưa hoàn thành, hãy dừng và trả về một dấu hiệu cho thấy nó không thể hoàn thành việc tính toán "?Tính toán bị ràng buộc trong Haskell

+0

Bạn đang xây dựng một số công cụ kiểm tra mô hình? –

+0

Trong số những thứ khác, có. – rwallace

+0

Điều này cũng có thể quan tâm: http://hackage.haskell.org/package/speculation – jberryman

Trả lời

8
+0

Cảm ơn! Điều đó chắc chắn trông giống như câu trả lời cho thời gian giới hạn. Nhìn qua phần tài liệu đó, dường như không có giải pháp tương tự nào cho bộ nhớ? – rwallace

+2

Thật vậy. Tôi không thể tưởng tượng được bất kỳ ngữ nghĩa hợp lý nào cho bộ nhớ, mặc dù - ngoài khó khăn cực đoan của việc đo lường mức tiêu thụ bộ nhớ một cách chính xác, điều gì sẽ xảy ra nếu có một luồng khác không bị hạn chế về bộ nhớ? Nếu bạn chia sẻ một số giá trị với chuỗi khác đó; ai "trả tiền cho nó"? Làm thế nào để bạn giải quyết những vấn đề đó một cách nhanh chóng, đủ để có được các phép đo mà không làm tê liệt chức năng đang chạy? –

+0

Vâng, đây là những vấn đề khó khăn và thành thật mà nói, tôi không lạc quan về xác suất của một ngôn ngữ có mục đích chung cung cấp giải pháp không có giá trị, nhưng tôi thấy nó đáng để thử trước khi từ bỏ bản thân mình để quản lý bộ nhớ của chính mình. . trong C++ :-) – rwallace

6

Dưới đây là một giải pháp hackish bạn thể thử: đẻ trứng tính của bạn với forkIO, và để cho các chủ đề cha mẹ (hoặc một sợi giám sát trong đó có quyền truy cập vào các chủ đề chia hai của ThreadId) theo định kỳ thăm dò ý kiến ​​cho bất kỳ số lượng nào bạn muốn và ném một ngoại lệ không đồng bộ vào chuỗi tính toán khi cần thiết (thú vị, đó chính xác là cách hoạt động của timeout.)

Câu hỏi tiếp theo là liệu Đó là một cách để tìm hiểu xem heap hiện tại lớn đến mức nào từ bên trong Haskell. Tổng mức tiêu thụ bộ nhớ và chu kỳ bạn có thể tìm ra bằng các lệnh shell sinh sản hoặc truy vấn hệ điều hành theo cách khác (tôi sẽ không biết cách thực hiện điều đó trên Windows.)

Đây không phải là giải pháp hoàn hảo mà bạn có thể triển khai và thử nghiệm sau vài phút.

+0

Tôi đang tìm kiếm một phương pháp sử dụng bộ nhớ, nhưng không thể tìm thấy nó trong Haskell. –

+0

Thay vì theo dõi việc sử dụng heap của ngã ba, bạn cũng có thể chỉ giới hạn heap của nó với 'RTS'opts, phải không? – leftaroundabout

+0

'forkIO' nằm trong cùng một chương trình Haskell. Trừ khi bạn đang thực sự sinh ra một quy trình mới, bạn đang làm việc trong vùng chia sẻ. –

6

Trên cấp độ xử lý, bạn có thể sử dụng GHC's RTS options để kiểm soát kích thước chồng và đống tối đa.

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