Использование памяти памяти Haskell (GHC) или что я делаю не так
-
28-09-2019 - |
Вопрос
Я написал небольшую программу, вид специализированного HTTP-сервера в Haskell, который не намного сложнее, чем код ниже. Что мне головоломки - это его потребление памяти. Скажем, когда я запускаю тест, компилируемый из прилагаемого кода, и внесю несколько почтовых запросов, содержащих до 20 МБ целую программу, будет иметь размер VM ~ 800 МБ, и это звучит нечетным. И это пространство не возвращается в систему, если я оставлю экземпляр такой программы, запущенного IDLE.
Что это значит?
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
(в Data.ByteString
/ Data.ByteString.Char8
модули в пакете bytestring
) вместо.
Во-вторых, GHC до и включая версию 6.12 не возвращает память в ОС. Однако предстоящий GHC 7.0 сделает это, поэтому попробуйте с Последний выпуск кандидата.