【发布时间】:2013-09-05 10:16:27
【问题描述】:
我有以下 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 会按预期执行。
有没有办法解决这个问题?
【问题讨论】:
-
我不得不承认我无法再重现这个(只要我启用优化)...
-
您是否总是将 OPTIONS_GHC 与其他 pragma 放在同一行?这可能无法真正实现优化。
标签: haskell bytestring long-lines lazy-io