3

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

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

4

1 回答 1

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
于 2013-05-09T14:23:57.603 回答