2015-07-22 16 views
6

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.

Trả lời

6

Tài liệu nói rằng decoded là ống kính từ luồng byte đến luồng giá trị được giải mã. Chúng tôi có thể lấy ra sau của cựu sử dụng view từ lens:

decoder :: Monad m => Int -> Producer P.ByteString m a -> Producer Int m() 
decoder n p = void (view P.decoded p) >-> P.take n 

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 
     runEffect $ decoder 10000 (PB.fromHandle h) >-> P.print 

Tôi không có nhiều kinh nghiệm với pipes, tôi chỉ đi theo các loại đây. Chương trình này dường như hoạt động như dự định.

+0

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;) –

Các vấn đề liên quan