2012-07-01 29 views
10

Tôi đã hy vọng sử dụng System.INotifySystem.IO.MMap cùng nhau để xem các sửa đổi tệp và sau đó nhanh chóng thực hiện các khác biệt để gửi bản vá qua mạng. Tuy nhiên, trong tài liệu hướng dẫn cho System.IO.MMap có một vài cảnh báo về tính minh bạch tham chiếu:Minh bạch tham chiếu và mmap trong Haskell

Các tài liệu khẳng định

Nó chỉ là an toàn để mmap một tập tin nếu bạn biết bạn là người dùng duy nhất. Nếu không thì tính minh bạch tham chiếu có thể có hoặc không bị xâm phạm. Các ngữ nghĩa đáng buồn khác nhau nhiều giữa các hệ điều hành.

Giá trị trả về MMap là IO ByteString, chắc chắn khi tôi sử dụng giá trị này với putStr Tôi đang mong đợi một kết quả khác nhau mỗi lần? Tôi giả sử rằng tác giả có nghĩa là giá trị có thể thay đổi trong một hoạt động IO như putStr và sự cố?

START-OF-EDIT: Nghĩ về nó, tôi đoán câu trả lời cho phần này của câu hỏi có phần rõ ràng ... Nếu giá trị thay đổi bất kỳ lúc nào sau khi được mở hộp thì sẽ có vấn đề.

do 
    v <- mappedValue :: IO ByteString 
    putStr v 
    putStr v -- Expects the same value of v everywhere 

end-of-EDIT

nên không nó có thể để có được một số loại khóa trên khu vực bản đồ hoặc vào file?

Cách khác, bạn có thể viết hàm copy :: IO ByteString -> IO ByteString chụp nhanh tệp ở trạng thái hiện tại một cách an toàn không?

+0

Âm thanh với tôi như những gì bạn muốn có thể được thực hiện cũng như với một cặp ống đơn giản. – leftaroundabout

+0

Tôi đang "xem" các tệp trong một thư mục theo kiểu hơi chung chung. Nếu bất kỳ công cụ nào chạm vào chúng, các máy khách sẽ tự động được cập nhật. –

+1

Có thực sự không có thư viện mmap cung cấp một cái gì đó loại IO (Ptr Word8) 'hoặc tương tự? –

Trả lời

8

Tôi nghĩ tác giả có nghĩa là giá trị có thể thay đổi ngay cả bên trong một hàm được dỡ bỏ có thể xem nó như là một đồng bằng ByteString (không có IO).

Tệp ánh xạ meory là vùng bộ nhớ. Nó không có ý nghĩa nhiều để sao chép nội dung của nó qua lại, vì lý do hiệu suất (nếu không một người chỉ có thể làm đồng bằng cũ dựa trên I/O). Vì vậy, ByteString bạn đang nhận được là trực tiếp.

Nếu bạn muốn có ảnh chụp nhanh, chỉ cần sử dụng I/O dựa trên luồng. Đó là những gì đọc một tập tin nào: tạo một ảnh chụp nhanh trong bộ nhớ! Tôi đoán một thay thế sẽ được sử dụng giao diện ForeignPtr mà không mang theo cảnh báo minh bạch tham chiếu. Tôi không quen thuộc với ForeignPtrs vì vậy tôi không thể đảm bảo nó sẽ làm việc, nhưng có vẻ đầy hứa hẹn và tôi sẽ điều tra nó.

Bạn cũng có thể thử gọi map id trên ByteString của mình nhưng không đảm bảo bạn sẽ nhận được bản sao khác với bản gốc.

Khóa tệp bắt buộc, đặc biệt là trên Linux, là một mớ hỗn độn tránh được tốt hơn. Khóa tập tin tư vấn là OK, ngoại trừ không ai đang sử dụng nó, vì vậy nó có hiệu quả không tồn tại.

+2

Tôi đoán rằng tiềm thức tôi ' m mong đợi một chút quá nhiều từ hệ điều hành của tôi. Tôi muốn xử lý các tập tin, về cơ bản, giống như một bộ nhớ cache chia sẻ nhanh chóng thực sự giữa nhiều quy trình, cho phép hệ điều hành chăm sóc các thay đổi xả đĩa theo ý muốn. Suy nghĩ về nó cẩn thận hơn Tôi đoán rằng có vẻ khá khó để làm việc trừ khi tất cả các quy trình sử dụng một cách rõ ràng một bản đồ bộ nhớ chia sẻ. –

+0

(Xem, tôi hy vọng tránh phát sinh độ trễ liên quan đến việc chạm vào đĩa vật lý ...) –

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