Question

J'ai écrit un petit programme, type de serveur HTTP spécialisé dans haskell, ce qui est beaucoup plus complexe que le code ci-dessous. Ce qui me déconcerte est sa consommation de mémoire. Dis, quand je lance un test compilé à partir du code ci-joint et faire plusieurs requêtes POST contenant jusqu'à programme tout le corps 20Mb aura la taille VM de ~ 800 Mo et cela semble étrange. Et cet espace n'est pas retourné au système si je laisse une instance de cette marche à vide du programme.

Qu'est-ce que cela signifie?


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
Était-ce utile?

La solution

Tout d'abord, vous utilisez String. Ceci est une représentation inefficace pour beaucoup de données; le coût est quelque chose comme 20 octets par caractère. Vous devez utiliser ByteString (dans les modules Data.ByteString / Data.ByteString.Char8 dans le paquet bytestring) au lieu.

En second lieu, GHC jusqu'à et y compris la version 6.12 ne retourne pas la mémoire au système d'exploitation. Cependant, la prochaine GHC 7.0 fera cela, alors essayez le dernière release candidate .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top