Mam duże pliki, w których przechowuję dane Binary
. Istnieje wiele wątków do czytania i zapisywania tych plików, mój obecny projekt synchronizuje je przy użyciu pojedynczego Lock
. W ten sposób mam tylko jedną otwartą dla pliku Handle
w ReadWriteMode
, a wszystkie wątki walczą o tę pojedynczą blokadę, kiedy mają ochotę wykonać niektóre operacje wejścia/wyjścia.Równoczesne czytanie/zapisywanie w Haskell?
Chciałbym poprawić tę sytuację, umożliwiając jednoczesną pracę wielu czytników. Próbowałem użyć RWLock
i otworzyć wiele uchwytów. Numer RWLock
zapewnia, że tylko jeden wątek modyfikuje plik, podczas gdy wiele wątków (tyle, ile mam otwartych uchwytów, stała czasu kompilacji) może czytać jednocześnie. Kiedy próbowałem to uruchomić, uderzył mnie fakt, że plik runtime allows only oneHandle
w pliku istnieje w dowolnym momencie.
Jak mogę rozwiązać tę sytuację? Zakładam, że uzyskanie/zwolnienie Handle
jest kosztowną operacją, więc samo otwarcie pliku w odpowiednim trybie po nabyciu RWLock
nie jest tak naprawdę opcją. A może jest pakiet oferujący API podobny do metod Javy FileChannel
'read i write?
PS: Chciałbym obsługiwać 32-bitowe architektury, więc IO z mapami pamięci nie jest możliwe dla plików> 4GiB, prawda?
Czy próbowałeś za pomocą dowolnego równolegle I/O biblioteki do odczytu zapisu plików? Jest ich kilka, HDF5, PNetCDF, SIONlib ... wszystkie obsługują równoczesne czytanie/zapisywanie do plików równolegle w systemach pamięci współdzielonej i rozproszonej i wszystkie one skalują się całkiem dobrze do rdzenia O (10^4) . – gnzlbg