2010-11-02 40 views
3

我編寫了一個小程序,這是一種Haskell中的專用HTTP服務器,它不比下面的代碼複雜得多。令我困惑的是它的內存消耗。比如說,當我運行一個由附帶代碼編譯的測試,併發出幾個包含高達20Mb主體的POST請求時,整個程序的VM大小將達到〜800Mb,這聽起來很奇怪。如果我讓這個程序的一個實例空閒,這個空間就不會返回給系統。Haskell(ghc)運行時內存使用情況或我做了什麼錯誤

這是什麼意思?


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 

回答

7

首先,您正在使用String。這是大量數據的低效表示;成本是每個字符20字節。您應該使用ByteString(在bytestringData.ByteString/Data.ByteString.Char8模塊中)。其次,GHC高達幷包括版本6.12不會將內存返回給操作系統。然而即將到來的GHC 7.0將會這樣做,所以試試latest release candidate

+0

你能提供任何有關ghc RTS內存管理的鏈接嗎?我相信我觀察到一個佔用時間縮短的haskell程序。 – sacha 2010-11-03 07:24:06

+1

@sacha:你確定這是「虛擬記憶」而不是「活的記憶」嗎?後者可以由操作系統通過交換掉一些內存來回收進程的意願。前者是GHC編譯的程序(直到7.0)沒有發佈。 – mokus 2010-11-03 12:40:26

+0

其實我不是。 – sacha 2010-11-03 13:55:41