Tôi có một tệp lớn nơi tôi lưu trữ Binary
dữ liệu. Có nhiều chủ đề đọc và ghi các tệp này, thiết kế hiện tại của tôi đồng bộ hóa chúng bằng một đơn Lock
. Bằng cách này, tôi chỉ có một Handle
trong ReadWriteMode
mở cho một tệp và tất cả các chuỗi chiến đấu cho khóa đơn đó khi họ cảm thấy thích làm một số I/O.Tệp đồng thời đọc/ghi trong Haskell?
Tôi muốn cải thiện điều này bằng cách cho phép nhiều người đọc làm việc đồng thời. Những gì tôi đã thử đã sử dụng một số RWLock
và có nhiều Xử lý mở. RWLock
sẽ đảm bảo rằng chỉ có một chủ đề sửa đổi tệp, trong khi nhiều luồng (nhiều như tôi có xử lý mở, hằng số biên dịch) được phép đọc đồng thời. Khi cố gắng chạy điều này, tôi bị ảnh hưởng bởi thực tế là thời gian chạy allows only oneHandle
trong ReadWriteMode
để tồn tại cho một tệp bất kỳ lúc nào.
Tôi làm cách nào để giải quyết tình huống này? Tôi giả định có được/phát hành Handle
là một hoạt động tốn kém, vì vậy chỉ cần mở tệp ở chế độ thích hợp sau khi có được RWLock
không thực sự là một tùy chọn. Hoặc có thể có một gói cung cấp một API tương tự như các phương thức read và write của Java FileChannel
?
PS: Tôi muốn hỗ trợ kiến trúc 32 bit, do đó, không thể ánh xạ bộ nhớ IO cho các tệp> 4GiB, phải không?
bạn đã thử sử dụng bất kỳ song song I/O thư viện để đọc ghi tập tin? Có một vài người trong số họ, HDF5, PNetCDF, SIONlib ... tất cả đều hỗ trợ đọc/ghi đồng thời với các tệp song song trong cả hệ thống bộ nhớ được chia sẻ và phân phối và tất cả chúng đều khá tốt với tối đa O (10^4) lõi . – gnzlbg