整数の文字列の最大合計部分文字列を計算するための次の 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 は期待どおりに動作します。
これを回避する方法はありますか?