我有以下 Haskell 程序来计算一串整数的最大和子串:
{-# LANGUAGE BangPatterns #-} {-# OPTIONS_GHC -O2 #-}
import Data.Functor
import Data.Maybe
import Data.ByteString.Lazy.Char8 (getContents,lines,readInt,words)
import Prelude hiding (getContents,words,lines)
main = do
cont <- words <$> getContents
putStrLn $ show $ snd $ foldl opt (0,0) $ map (fst.fromJust.readInt) cont
opt (!c,!m) x = (max 0 (c+x),max m (c+x))
这个程序的问题在于它将整个文件读入内存。对应的没有BytesString的程序就没有这个问题:
{-# LANGUAGE BangPatterns #-} {-# OPTIONS_GHC -O2 #-}
import Data.Functor
import Data.Maybe
main = do
cont <- words <$> getContents
putStrLn $ show $ snd $ foldl opt (0,0) $ map read cont
opt (!c,!m) x = (max 0 (c+x),max m (c+x))
它只使用少量的恒定内存,但当然速度非常慢(大约慢 25 倍)。
该问题仅发生在读取非常大行的程序中。如果输入分布在多条小行上,ByteString 将按预期执行。
有没有办法解决?