【问题标题】:Haskell (ghc) runtime memory usage or what do I do wrongHaskell(ghc)运行时内存使用或我做错了什么
【发布时间】:2011-05-04 04:48:40
【问题描述】:

我在 haskell 中编写了一个小程序,一种专门的 HTTP 服务器,它并不比下面的代码复杂多少。令我困惑的是它的内存消耗。比如说,当我运行从随附代码编译的测试并发出几个包含高达 20Mb 主体的 POST 请求时,整个程序的 VM 大小约为 800Mb,这听起来很奇怪。如果我让此类程序的实例处于空闲状态,则此空间不会返回系统。

这是什么意思?


import System.IO
import Network.HTTP.Server
import Network.Socket
import Network.URL


handler :: SockAddr -> URL -> Request String -> IO (Response String)
handler sa url rq = do
  writeFile "/tmp/out" (rqBody rq)
  return $ insertHeader HdrContentLength "0" (respond OK :: Response String)

main = serverWith defaultConfig {srvPort = 2121} handler

【问题讨论】:

    标签: haskell ghc heap-memory


    【解决方案1】:

    首先,您使用的是String。对于大量数据,这是一种低效的表示;成本大约是每个字符 20 个字节。您应该改用ByteString(在bytestring 包中的Data.ByteString / Data.ByteString.Char8 模块中)。

    其次,直到 6.12 版(包括 6.12 版)的 GHC 不会将内存返回给操作系统。然而,即将推出的 GHC 7.0 将执行此操作,因此请尝试使用 latest release candidate

    【讨论】:

    • 您能否提供有关 ghc RTS 中内存管理的任何链接?我相信我观察到了一个 haskell 程序,它的足迹随着时间的推移而缩小。
    • @sacha:你确定缩小的是“虚拟内存”,而不仅仅是“活内存”吗?操作系统可以通过交换部分内存来违背进程的意愿回收后者。前者是 GHC 编译的程序(直到 7.0)不发布的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多