Haskell (GHC) utilisation de la mémoire d'exécution ou que dois-je faire mal
-
28-09-2019 - |
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
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 .