内存映射大文件 Haskell

10

我正在尝试使用Haskell的mmap包进行实验,由于对Haskell很新,所以我正在尝试编写一个小程序将少量数据写入内存映射文件。

这段代码正确地创建了文件大小,但似乎没有将向量中的数据刷新到内存映射文件中;我使用hexdump进行了验证 - 它只是全部为0。

出了什么问题?

import Control.Monad
import Data.Vector.Storable
import Foreign.Marshal.Array
import System.Directory
import System.IO
import System.IO.MMap

createFile :: FilePath -> Integer -> IO ()
createFile path size = do
    h <- openBinaryFile path WriteMode
    hSetFileSize h size

n = 10
size = 10 * 8
path = "test.dat" :: FilePath

main :: IO ()
main = do
    createFile "signal.ml" size
    let v = generate n (\i -> i) :: Vector Int
    putStrLn $ show v
    (ptr, s, _, _) <- mmapFilePtr path ReadWrite Nothing
    unsafeWith v (\srcPtr -> copyArray ptr srcPtr n)
    munmapFilePtr ptr s

非常感谢。


2
System.IO.MMap 的手册指出,在更改后,“过一段时间它将被写入磁盘。不确定何时会发生这种情况”,这是一个很好的问题,是否可能强制执行它... - Yuuri
1个回答

10

看起来是个打字错误。如果我替换这个:

createFile "signal.ml" size

用这个:

createFile path size

我得到了正确的结果:

$ xxd test.dat 
0000000: 0000 0000 0000 0000 0100 0000 0000 0000  ................
0000010: 0200 0000 0000 0000 0300 0000 0000 0000  ................
0000020: 0400 0000 0000 0000 0500 0000 0000 0000  ................
0000030: 0600 0000 0000 0000 0700 0000 0000 0000  ................
0000040: 0800 0000 0000 0000 0900 0000 0000 0000  ................

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接