gpt4 book ai didi

haskell - 内存分析会改变内存使用情况(变得更好)

转载 作者:行者123 更新时间:2023-12-03 01:32:18 26 4
gpt4 key购买 nike

这实际上是this的后续问题问题。我设法让分析工作正常进行,问题似乎确实是懒惰的评估。

我使用的数据结构是Map Int (Map Int Text),其中Text来自Data.Text 。问题是,构建这个 map 的函数会产生一个巨大的重击。处理大约 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

不漂亮,但它完成了工作。我在创建 TextResource 后立即在主函数中使用此函数。有趣的是,当我使用 RTS 选项 -hr-hc 分析程序时,一段时间后内存使用量下降到 70 或 50 MB,这那就完全没问题了。

不幸的是,这仅在使用分析选项和 totalSize 函数时才有效 - 如果没有它们,它会回到 250 MB。

我上传了程序(< 70行)以及测试文件和cabal文件,以便您可以自己尝试一下:Link

test.xml是生成的XML文件,应将其放入可执行文件目录中。要构建,cabal configure --enable-executable-profiling 和之后的 cabal build 应该足够了(如果您安装了所需库的分析版本)。

使用+RTS -hc运行程序一次和不使用+RTS -hc运行程序一次时,您可以看到变化。

如果有人可以运行该程序,我会非常高兴,因为我真的被困在这里了。我已经尝试在几个地方放入deepseq,但没有任何效果(嗯,除了使用分析选项之外)。

编辑:

Profiling does show, however, that only ~20MB of the heap is used, so as in my comment, I blame GHC for not freeing as much of the GC nursery memory as you seem to want.

谢谢,这为我指明了正确的方向。事实证明,您可以告诉 GHC 执行垃圾收集 ( performGC ),在对 map 进行深度搜索后,效果非常好。尽管我猜想不推荐使用performGC,但它似乎是适合这里工作的工具。

编辑2:这就是我更改 main 函数的方式(+ deepseqing buildTextFile 的返回):

main = do tf <- buildTextFile "test.xml"
performGC
putStrLn . show . text 1 1000 $ tf
getLine
putStrLn . show . text 100 1000 $ tf
return ()

最佳答案

The problem is, that the function which builds this map creates a huge thunk.

没有。基于堆分析,我不认为空间使用是重击。另外,我用严格的 HashMap 替换了 Data.Map,并强制映射(以避免创建大的重击)具有相同的结果。

when I profile the program by using the RTS option -hr or -hc the memory usage goes down to 70 or 50 MB after a while

我无法重现这个。使用 -hr-hy-hc 进程会保留 140MB 堆。然而,分析确实表明只使用了大约 20MB 的堆,因此正如我在评论中所说,我责怪 GHC 没有释放您想要的那么多 GC 苗圃内存。

The -hy profile

对于计算过程中的高内存使用,上面的-hy配置文件显示大部分内存是由于String类型和HaXML库Posn 类型。我将重申我的建议,即寻找一个基于 ByteStringText 的 XML 库,该库更注重资源(xml-enumerator?)。

关于haskell - 内存分析会改变内存使用情况(变得更好),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6878334/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com