2015-03-13 14 views
18

Tôi có một đoạn mã mà xử lý file,Phân phối Haskell trên một cụm

processFiles :: [FilePath] -> (FilePath -> IO()) -> IO() 

Chức năng này sinh ra một quá trình async rằng thực hiện một hành động IO. Hành động IO này phải được gửi đến một cụm thông qua một hệ thống lập kế hoạch công việc (ví dụ: Slurm).

Vì tôi phải sử dụng hệ thống lập kế hoạch công việc nên không thể sử dụng cloudHaskell để phân phối đóng. Thay vào đó, chương trình viết Main.hs mới chứa các tính toán mong muốn, được sao chép vào nút cụm cùng với tất cả các mô đun phụ thuộc vào và sau đó nó được thực thi từ xa với "runhaskell Main.hs [opts]". Sau đó, quá trình không đồng bộ nên yêu cầu định kỳ đến hệ thống lập kế hoạch công việc (sử dụng luồngDelay) nếu công việc được thực hiện.

Có cách nào để tránh tạo một Chính mới không? Tôi có thể tuần tự hóa các hành động IO và thực hiện nó bằng cách nào đó trong nút?

+1

Andrew Cowie và Ozgun Ataman đề nghị tôi biên dịch chương trình và gửi nó đến các nút, vì nhị phân biên dịch là khép kín và dễ dàng để rsync. Một ví dụ của việc này là Hadron MapReduce dựa trên Hadron [1] dựa trên các chương trình để cụm các nút tại nơi làm việc, được phát triển bởi Ozgun Ataman. [1] https://github.com/soostone/hadron – felipez

Trả lời

1

Đúng. Có một thư viện ma thuật có tên là packman. Nó cho phép bạn biến bất kỳ điều Haskell vào dữ liệu (miễn là nó không có IORef s hoặc những thứ liên quan đến họ.) Ở đây, mọi thứ bạn sẽ cần:

trySerialize :: a -> IO (Serialized a) 
deserialize :: Serialized a -> IO a 
instance Typeable a => Binary (Serialized a) 

Yep, đó là những loại chính xác. Bạn có thể đóng gói các hành động IO của mình bằng cách sử dụng trySerialize, sử dụng Binary để chuyển nó đến bất cứ đâu và sau đó deserialize để thực hiện thao tác IO, sẵn sàng để sử dụng.

Hãy cẩn thận cho packman là:

  • Nó lưu trữ những thứ như thunks. Đây có lẽ là những gì bạn muốn, để nút có thể thực hiện đánh giá.
    • Điều đó nói rằng, nếu phần lớn của bạn là rất lớn, thì Binary có thể sẽ rất lớn. Đánh giá thunk có thể sửa lỗi này.
    • Như tôi đã nói, các tham chiếu có thể thay đổi là không có. Một điều cần lưu ý là chúng là bên trong các khối mà bạn không biết điều đó.

Khác hơn thế, điều này có vẻ như những gì bạn muốn!

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