Использование оперативной памяти Haskell (ghc) или что я делаю не так

Я написал небольшую программу, что-то вроде специализированного HTTP-сервера на Haskell, которая ненамного сложнее, чем приведенный ниже код. Что меня озадачивает, так это потребление памяти. Скажем, когда я запускаю тест, скомпилированный из прилагаемого кода, и делаю несколько POST-запросов, содержащих до 20 МБ тела, вся программа будет иметь размер виртуальной машины ~ 800 МБ, и это звучит странно. И это пространство не возвращается системе, если я оставлю экземпляр такой программы бездействующим.

Что это значит?


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

person sacha    schedule 02.11.2010    source источник


Ответы (1)


Во-первых, вы используете String. Это неэффективное представление большого количества данных; стоимость составляет что-то вроде 20 байтов на символ. Вместо этого следует использовать ByteString (в модулях Data.ByteString/Data.ByteString.Char8 пакета bytestring).

Во-вторых, GHC до версии 6.12 включительно не возвращает память ОС. Однако грядущий GHC 7.0 будет делать это, поэтому попробуйте последний релиз-кандидат .

person GS - Apologise to Monica    schedule 02.11.2010
comment
Можете ли вы предоставить какую-либо ссылку об управлении памятью в ghc RTS? Кажется, я наблюдал программу на хаскеле, размер которой со временем уменьшился. - person sacha; 03.11.2010
comment
@sacha: ты уверен, что уменьшилась виртуальная память, а не только живая память? Последняя может быть восстановлена ​​ОС против воли процесса путем выгрузки части его памяти. Первое — это то, что программы, скомпилированные с помощью GHC (до версии 7.0), не выпускают. - person mokus; 03.11.2010