我在Haskell中写了一个小程序,其中一种专业的HTTP服务器,它比下面的代码复杂得多。令人困惑的是它的记忆消耗。说,当我从封闭的代码中运行汇编的测试时,并提出了多个包含20MB身体的帖子请求,整个程序的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
有帮助吗?

解决方案

首先,您正在使用 String. 。这是大量数据的效率低下。费用大约是每个字符的20个字节。您应该使用 ByteString (在里面 Data.ByteString / Data.ByteString.Char8 包装中的模块 bytestring) 反而。

其次,GHC直至和包含6.12版本都不会返回内存到OS。但是,即将到来的GHC 7.0会这样做,因此请尝试 最新版本候选人.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top