Tôi đang cố đọc và ghi rất nhiều int trong bộ nhớ không đổi. Tôi đã tìm ra cách viết ints vào bộ nhớ nhưng không tìm ra cách để đọc chúng trở lại.Sử dụng Ống để đọc và ghi dữ liệu nhị phân trong Haskell
import Control.Lens (zoom)
import System.IO (IOMode(..), withFile)
import Pipes
import qualified Pipes.Prelude as P
import qualified Pipes.ByteString as PB
import qualified Pipes.Parse as P
import qualified Pipes.Binary as P
intStream :: Monad m => Proxy x' x() Int m b
intStream = go (0 :: Int) where
go i = yield i >> go (i + 1)
decoder :: Monad m => Int -> P.Parser P.ByteString m [Int]
decoder n = zoom (P.decoded . P.splitAt n) P.drawAll
main :: IO()
main = do
withFile "ints" WriteMode $ \h -> do
runEffect $ for intStream P.encode >-> P.take 10000 >-> PB.toHandle h
withFile "ints" ReadMode $ \h -> do
xs <- P.evalStateT (decoder 10000000) (PB.fromHandle h)
print xs
Tôi có chức năng bộ giải mã từ tài liệu cho Pipes.Binary. Tuy nhiên nó sử dụng drawAll
mà theo documentationdrawAll
không phải là sử dụng thành ngữ của Ống và được cung cấp cho mục đích thử nghiệm.
Câu hỏi của tôi là cách sửa đổi decoder
để nó không sử dụng drawAll
và do đó không tải tất cả các giá trị của xs
vào bộ nhớ. Vì vậy, thay vì in danh sách các xs tôi có thể P.map print
trên một dòng giải mã ints
được đọc từ tệp.
Tôi cố gắng theo dõi các loại nhưng đôi khi sẽ khó khăn khi các loại bắt đầu trông giống như súp bảng chữ cái;) –