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

StackOverflow https://stackoverflow.com/questions/4082375

  •  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 байтов на персонаж. Вы должны использовать ByteStringData.ByteString / Data.ByteString.Char8 модули в пакете bytestring) вместо.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top