加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Haskell(ghc)运行时内存使用情况或我做错了什么

发布时间:2020-12-15 08:36:07 所属栏目:Java 来源:网络整理
导读:我在 haskell中编写了一个小程序,一种专门的HTTP服务器,它并不比下面的代码复杂得多.令我困惑的是它的内存消耗.比方说,当我运行一个从附带的代码编译的测试并且发出几个包含高达20Mb的整个程序的POST请求时,整个程序的VM大小将达到~800Mb,这听起来很奇怪.如
我在 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

解决方法

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

其次,GHC(包括版本6.12)不会将内存返回给操作系统.然而即将推出的GHC 7.0将会这样做,所以试试latest release candidate吧.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读