
Hello David, Wednesday, July 12, 2006, 4:51:26 PM, you wrote:
Using memory-mapped files provides slight speed improvement because it excludes the need to move data between OS buffer and application buffer. Moreover, this may scale better in multi-threading environments without need to implement special async I/O, although i don't checked this assumption.
There's also the potentially quite significant advantage that with mmapped files you can open up files much larger than the physical memory size.
you can do the same with regular files
Or if you open smaller files, but the system begins to swap, mmaped files don't have to be swapped to a swap file, which makes things more efficient in general. In my opinion this is a much more important reason to use mmap than avoiding a memory copy from kernel space to user space.
you mean reading from thousands of small files files simultaneously? on windows using mmaped files has the disadvantage of swapping out in first place everything other! so when you write to such file, say, 1gb of data and have 1 gb or less of memory, all the programs will swapped to disk! anyway, now Streams library contains simple but powerful and OS-independent interface to mmaped files that can be used beyond my own support for mmaped file as Stream instance. The whole interface is: -- | Memory-mapped file handle. It's just FD on Unix type MemoryMappedFD -- | Open file handle 'FD' opened in read/write mode 'IOMode' for following mapping operations -- and return mapping handle 'MemoryMappedFD'. In Unix it just returns FD itself myOpenMMap :: FD -> IOMode -> IO MemoryMappedFD -- | Map 'Int' bytes of file starting from position 'Integer' and return address of mapped buffer. -- Mapping done for file with handle 'MemoryMappedFD' open in read/write mode 'IOMode'. myMMap :: MemoryMappedFD -> IOMode -> Integer -> Int -> IO (Ptr Word8) -- | Flush mmapped buffer with address 'Ptr' and size 'Int' myFlushMMap :: Ptr Word8 -> Int -> IO () -- | Unmap buffer with address 'Ptr' and size 'Int' myUnMMap :: Ptr Word8 -> Int -> IO () -- | Close "mapping handle". In Unix it does nothing myCloseMMap :: MemoryMappedFD -> IO () (although the function names looks a bit stupid ;) ) -- Best regards, Bulat mailto:Bulat.Ziganshin@gmail.com