ฉันกำลังพยายามอ่านเวกเตอร์ขนาดใหญ่ประเภทข้อมูลที่กำหนดเองจากไฟล์ไบนารี ฉันพยายามใช้ตัวอย่างที่ให้ไว้ที่นี่.
ปัญหาของโค้ดตัวอย่างคือ มันใช้รายการ และฉันต้องการใช้เวกเตอร์ ดังนั้นฉันจึงปรับโค้ดนั้นตามด้านล่าง แต่ใช้เวลานานมาก (มากกว่าหนึ่งนาทีหลังจากนั้น) เพื่ออ่านไฟล์ขนาด 1 MB
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 ...
จะอ่านคู่ของค่าจาก bytestring เป็น vector ได้อย่างมีประสิทธิภาพได้อย่างไร
ฉันต้องการรับโค้ดการทำงานที่สมบูรณ์ ไม่ใช่แค่ตัวชี้ไปยังไซต์ Haskell หรือ RWH หรือเพียงรายการฟังก์ชัน/ชื่อโมดูล
V.cons
คือ O(n) คุณคาดหวังอะไร? ล้านคูณล้านนั้นเยอะมาก!vector
มีเอกสารประกอบที่ดีอย่างสมบูรณ์ โปรดทราบว่าเอกสารสำหรับโมดูลแฮ็กโดยทั่วไปจะมีสารบัญอยู่ที่มุมขวาบน ตรวจสอบส่วนเกี่ยวกับการสร้างเวกเตอร์ - person dfeuer   schedule 19.09.2015Data.Sequence
แต่ในช่วงนี้ Ed Kmett กำลังพัฒนาอันที่เร็วกว่าอยู่ - person dfeuer   schedule 19.09.2015