Saya mencoba membaca vektor besar tipe data khusus dari file biner. Saya mencoba menggunakan contoh yang diberikan di sini.
Masalah dengan kode contohnya adalah, ia menggunakan daftar dan saya ingin menggunakan vektor. Jadi saya mengadaptasi kode itu seperti di bawah ini, tetapi butuh waktu sangat lama (lebih dari satu menit, saya menyerah setelah itu) untuk membaca file 1 MB sekalipun.
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)?
Ketika saya mencoba menjalankannya dengan ghc --make -O2 pairs.hs
saya mendapat kesalahan Stack space overflow: current size ...
Bagaimana cara membaca pasangan nilai dari bytestring ke vektor secara efisien?
Sekali lagi, saya ingin mendapatkan kode kerja yang lengkap tidak hanya hanya petunjuk ke situs Haskell atau RWH atau hanya daftar nama fungsi/modul.
V.cons
adalah O(n). Apa yang kamu harapkan? Satu juta kali satu juta itu banyak!vector
memiliki dokumentasi yang sangat bagus. Perhatikan bahwa dokumentasi modul Hackage umumnya memiliki daftar isi di kanan atas. Lihat bagian membangun vektor. - person dfeuer   schedule 19.09.2015Data.Sequence
, namun Ed Kmett sedang mengerjakan beberapa yang lebih cepat akhir-akhir ini. - person dfeuer   schedule 19.09.2015