Использование памяти во время выполнения на Haskell (ghc) или что я делаю не так - PullRequest
3 голосов
/ 03 ноября 2010

Я написал небольшую программу, своего рода специализированный 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

1 Ответ

7 голосов
/ 03 ноября 2010

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

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

...