2011-10-14 21 views
18

Tôi đã đọc rất nhiều lần rằng đánh giá lười biếng trong Haskell đôi khi có thể dẫn đến rò rỉ không gian. Loại mã nào có thể dẫn đến rò rỉ không gian? Làm thế nào để phát hiện chúng? Và những biện pháp phòng ngừa có thể được thực hiện trên một phần của một lập trình viên để tránh chúng?Rò rỉ không gian trong Haskell

+7

Hãy xem Edward Z. Yang's [Vườn thú rò rỉ không gian] (http://blog.ezyang.com/2011/05/space-leak-zoo/). –

Trả lời

12

Bạn sẽ nhận được rất nhiều câu trả lời, đây là câu trả lời, tôi đã gặp phải khi cố gắng thực hiện một số ứng dụng 'thế giới thực'. Tôi đã sử dụng đa luồng và một số MV để truyền dữ liệu xung quanh (MVar giống như bộ nhớ được chia sẻ bị khóa). mô hình điển hình của tôi là:

a <- takeMVar mvar 
putMVar mvar (a + 1) 

Và sau đó, chỉ thỉnh thoảng, khi một điều kiện thích hợp xảy ra tôi đã làm một cái gì đó như:

a <- takeMVar mvar 
when (a > 10) .... 

Vấn đề là nội dung của MVAR là chủ yếu (0 + 1 + 1 + 1 + ....) ... khá chuyên sâu cho các con số như 100k ... Loại vấn đề này khá phổ biến trong mã của tôi; Thật không may cho các ứng dụng đa luồng nó rất dễ dàng để có được vào các vấn đề như vậy.

Phát hiện ... những gì tôi đã làm là bắt đầu Haskell ở chế độ sản xuất dữ liệu liên quan đến tiêu thụ bộ nhớ, khởi động và dừng chủ đề khác nhau và tìm kiếm nếu bộ nhớ là ổn định hay không ...

Anotomy of a thunk leak (with instructions how to debug it)

Ví dụ: Thunk memory leak as a result of map function

4

Tôi đã gặp sự cố này khi thực hiện đệ quy trên cấu trúc dữ liệu lớn. Các khối xây dựng được nhận được quá nhiều và sau đó bạn nhận được một rò rỉ không gian.

Trong Haskell, bạn cần phải liên tục nhận thức được khả năng chạy vào chỗ rò rỉ. Vì phép lặp không tồn tại, về cơ bản, bất kỳ hàm đệ quy nào đều có khả năng tạo ra một rò rỉ không gian.

Để tránh sự cố này, hãy ghi nhớ các hàm đệ quy hoặc viết lại chúng theo cách đệ quy.

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