मैंने पढ़ा है और लगातार स्मृति में बहुत सारे ints लिखने के लिए कोशिश कर रहा हूँ में बाइनरी डेटा लिखने के लिए। मैं पता लगा है कि कैसे याद करने के लिए ints लिखने के लिए लेकिन पता लगा नहीं है कि कैसे उन्हें वापस पढ़ने के लिए।पाइपों का उपयोग करना पढ़ें और हास्केल
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
मैं Pipes.Binary के लिए दस्तावेज़ से डिकोडर समारोह मिला है। हालांकि यह drawAll
जो documentationdrawAll
के अनुसार पाइप्स की मुहावरेदार उपयोग नहीं है और परीक्षण प्रयोजनों के लिए प्रदान की जाती है का उपयोग करता है।
मेरा प्रश्न कैसे decoder
संशोधित करने के लिए इतना है कि यह drawAll
का उपयोग नहीं करता है और इस तरह स्मृति में xs
के सभी मानों लोड नहीं करता है। तो बजाय XS की सूची मुद्रण की मैं P.map print
डीकोड ints
की एक धारा से अधिक फ़ाइल से पढ़ा जा रहा सकता है।
मैं प्रकार पालन करने की कोशिश, लेकिन कभी कभी यह मुश्किल हो जाता है जब प्रकार वर्णमाला सूप की तरह तलाश शुरू;) –