【发布时间】:2014-01-15 08:03:27
【问题描述】:
我正在尝试使用 Haskell 查找文件中字符的频率。我希望能够处理大约 500MB 大小的文件。
到目前为止我已经尝试过什么
-
它可以完成这项工作,但它解析文件 256 次时有点慢
calculateFrequency :: L.ByteString -> [(Word8, Int64)] calculateFrequency f = foldl (\acc x -> (x, L.count x f):acc) [] [255, 254.. 0] -
我也尝试过使用 Data.Map 但程序内存不足(在 ghc 解释器中)。
import qualified Data.ByteString.Lazy as L import qualified Data.Map as M calculateFrequency' :: L.ByteString -> [(Word8, Int64)] calculateFrequency' xs = M.toList $ L.foldl' (\m word -> M.insertWith (+) word 1 m) (M.empty) xs
【问题讨论】:
-
如果你用
ghc -O2编译会发生什么?可能避免内存问题的严格优化可能只会在那时开始。 -
内存仍然不足。
-
如果切换到 Data.Map.Strict 会怎样:hackage.haskell.org/package/containers-0.5.0.0/docs/…
-
除此之外,也许使用 IntMap(您需要将 Word8 转换为 Int,但这应该没问题):hackage.haskell.org/package/containers-0.5.0.0/docs/…
-
@GaneshSittampalam 它没有耗尽内存,但仍然很慢。
标签: haskell bytestring