bzn*_*bzn 8 haskell memory-profiling
这实际上是这个问题的后续问题.我设法让分析工作,问题似乎真的是懒惰的评价.
我正在使用的数据结构是a Map Int (Map Int Text),其中Text来自Data.Text.问题是,构建此映射的函数会产生巨大的影响.处理大约3 MB的输入文本时,程序需要超过250 MB的内存.
现在来看这个问题的真正目的:
要获取此数据结构中的字符数,请使用以下函数:
type TextResource = M.Map Int (M.Map Int T.Text)
totalSize :: TextResouce -> Int
totalSize = M.fold ((+) . (M.fold ((+). T.length) 0)) 0
Run Code Online (Sandbox Code Playgroud)
不漂亮,但它完成了工作.我在创建TextResource后立即在main函数中使用此函数.有趣的是,当我使用RTS选项配置程序时,-hr或者-hc内存使用量在一段时间后降至70或50 MB,这将是完全正常的.
不幸的是,这仅在使用性能分析选项和totalSize功能时才有效- 没有它们它会回到250 MB.
我将程序(<70行)与测试文件和cabal文件一起上传,以便您可以自己尝试:链接
test.xml是生成的XML文件,应放入executables目录中.要构建,cabal configure --enable-executable-profiling之后cabal build应该足够了(如果你安装了所需库的分析版本).
您可以在运行程序时看到更改一次,+RTS -hc一次运行没有.
如果有人可以运行这个程序,我真的很棒,因为我真的被困在这里.我已经尝试过deepseq几个地方,但没有任何作用(好吧,除了使用分析选项).
编辑:
然而,分析确实表明只使用了大约20MB的堆,因此在我的评论中,我责怪GHC没有像你想要的那样释放尽可能多的GC托儿所内存.
谢谢,这指出了我正确的方向.事实证明,你可以告诉GHC执行垃圾收集(performGC),在深度调整地图后,它可以很好地工作.虽然我猜不推荐使用performGC,但这似乎是适合这项工作的正确工具.
Edit2: 这是我改变main函数的方法(+ deepseqing返回buildTextFile):
main = do tf <- buildTextFile "test.xml"
performGC
putStrLn . show . text 1 1000 $ tf
getLine
putStrLn . show . text 100 1000 $ tf
return ()
Run Code Online (Sandbox Code Playgroud)
问题是,构建这个地图的函数会产生一个巨大的重击。
不。根据堆分析,我不认为空间使用是重击。另外,我用Data.Map严格的 HashMap 替换并强制映射(以避免创建大的重击)具有相同的结果。
当我使用 RTS 选项 -hr 或 -hc 分析程序时,一段时间后内存使用量下降到 70 或 50 MB
我无法重现这个。使用-hr、-hy、 或 时,-hc进程会保留 140MB 的堆。然而,分析确实表明只使用了约 20MB 的堆,因此正如我的评论中所述,我责怪 GHC 没有释放您想要的那么多 GC 苗圃内存。

至于计算期间的高内存使用,上面的-hy配置文件显示大部分内存是由于String类型和 HaXML 库Posn类型造成的。我将重申我的建议,即寻找一个ByteString或Text基于 XML 的库,该库更具资源意识(xml-enumerator?)。
| 归档时间: |
|
| 查看次数: |
377 次 |
| 最近记录: |