Haskell(GHC)运行时内存使用或我做错了什么
-
28-09-2019 - |
题
我在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会这样做,因此请尝试 最新版本候选人.
不隶属于 StackOverflow