3

私はファイルの名前を(文字列として)持っており、そのファイルには特定の量(たとえば1000000)の倍精度浮動小数点値(バイナリとして保存され、それぞれに8バイト、明らかに)が含まれています。

これらの double をベクトルに読み込む最良の方法は何でしょうか?

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 に答える