Я пытаюсь прочитать большой вектор пользовательского типа данных из двоичного файла. Я попытался использовать пример , приведенный здесь.
Проблема с примером кода в том, что он использует списки, а я хочу использовать векторы. Поэтому я адаптировал этот код, как показано ниже, но для чтения даже файла размером 1 МБ требуется очень много времени (больше минуты, после этого я сдался).
module Main where
import Data.Word
import qualified Data.ByteString.Lazy as BIN
import Data.Binary.Get
import qualified Data.Vector.Unboxed as Vec
main = do
b <- BIN.readFile "dat.bin" -- about 1 MB size file
let v = runGet getPairs (BIN.tail b) -- skip the first byte
putStrLn $ show $ Vec.length v
getPair :: Get (Word8, Word8)
getPair = do
price <- getWord8
qty <- getWord8
return (price, qty)
getPairs :: Get (Vec.Vector (Word8, Word8))
getPairs = do
empty <- isEmpty
if empty
then return Vec.empty
else do pair <- getPair
pairs <- getPairs
return (Vec.cons pair pairs) -- is it slow because V.cons is O(n)?
Когда я попытался запустить его с ghc --make -O2 pairs.hs
, я получил ошибку Stack space overflow: current size ...
Как эффективно считывать пары значений из байтовой строки в вектор?
Опять же, я хочу получить полный рабочий код, а не только указатели на сайт Haskell или RWH, или просто список имён функций / модулей.
V.cons
равно O (n). Что вы ожидали? Миллион раз на миллион - это много!vector
имеет отличную документацию. Обратите внимание, что документация по модулю Hackage обычно имеет оглавление в правом верхнем углу. Ознакомьтесь с разделом о построении векторов. - person dfeuer   schedule 19.09.2015Data.Sequence
, но Эд Кмет в последнее время работает над некоторыми более быстрыми. - person dfeuer   schedule 19.09.2015