2010-11-02 1 views
3

Я написал небольшую программу, вроде специализированного HTTP-сервера в haskell, которая не намного сложнее, чем код ниже. Меня озадачивает потребление памяти. Скажем, когда я запускаю тест, составленный из прилагаемого кода, и делаю несколько POST-запросов, содержащих до 20 Мб тела, вся программа будет иметь размер VM ~ 800 Мб, и это звучит странно. И это пространство не возвращается в систему, если я оставляю экземпляр такой программы, работающей в режиме ожидания.Использование памяти памяти 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 (в модулях Data.ByteString/Data.ByteString.Char8 в пакете bytestring).

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

+0

Можете ли вы предоставить любую ссылку на управление памятью в ghc RTS? Я считаю, что я наблюдал программу haskell, размер которой со временем сократился. – sacha

+1

@sacha: вы уверены, что это была «виртуальная память», которая сократилась, а не только «живая память»? Последняя может быть восстановлена ​​ОС по желанию процесса, заменив часть ее памяти. Первое - это то, что GKC-скомпилированные программы (до 7.0) не выпускаются. – mokus

+0

На самом деле я нет. – sacha

Смежные вопросы