我在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
GS - Apologi.. 7
首先,你正在使用String
.这是大量数据的低效表示; 成本大约是每个字符20个字节.您应该使用ByteString
(在包中的Data.ByteString
/ Data.ByteString.Char8
modules中bytestring
).
其次,GHC(包括版本6.12)不会将内存返回给操作系统.然而,即将推出的GHC 7.0将会这样做,所以请尝试使用最新的候选版本.
首先,你正在使用String
.这是大量数据的低效表示; 成本大约是每个字符20个字节.您应该使用ByteString
(在包中的Data.ByteString
/ Data.ByteString.Char8
modules中bytestring
).
其次,GHC(包括版本6.12)不会将内存返回给操作系统.然而,即将推出的GHC 7.0将会这样做,所以请尝试使用最新的候选版本.