如何将文件读入双打矢量?

时间:2013-05-09 10:25:42

标签: file haskell

我有一个文件的名称(作为字符串),并且该文件包含一定数量(例如1000000)双精度浮点值(存储为二进制,显然每个8字节)。

将这些双打读入矢量的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

以下是我最终的表现:

import qualified Data.Vector.Unboxed as V
import qualified Data.Vector.Unboxed.Mutable as VM
import qualified Data.ByteString.Lazy as BS
import Data.Binary
import Data.Binary.Get
import System.IO.Unsafe (unsafePerformIO)
import Unsafe.Coerce

readDoubles :: Int -> FilePath -> IO (V.Vector Double)
readDoubles n f = BS.readFile f >>= return . runGet (getVector n)

getVector :: Int -> Get (V.Vector Double)
{-# INLINE getVector #-}
getVector n = do
    mv <- liftGet $ VM.new n
    let fill i
            | i < n = do
                x <- fmap unsafeCoerce getWord64be
                (unsafePerformIO $ VM.unsafeWrite mv i x) `seq` return ()
                fill (i+1)
            | otherwise = return ()
    fill 0
    liftGet $ V.unsafeFreeze mv

liftGet :: IO b -> Get b
liftGet = return . unsafePerformIO