Domanda

ho scritto un piccolo programma, tipo di server HTTP specializzato in Haskell, che non è molto più complessa di quanto il codice qui sotto. Quello che mi lascia perplesso è il suo consumo di memoria. Dire, quando si esegue un test compilato dal codice chiuso e fare diverse richieste POST contenenti fino a 20Mb corpo intero programma avrà dimensioni VM di ~ 800Mb e questo suoni strano. E questo spazio non viene restituito al sistema se lascio un esempio di tale programma di inattività in esecuzione.

Che cosa significa?


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
È stato utile?

Soluzione

In primo luogo, si sta utilizzando String. Questa è una rappresentazione inefficiente per un sacco di dati; il costo è di qualcosa come 20 byte per carattere. Si dovrebbe usare ByteString (nei moduli Data.ByteString / Data.ByteString.Char8 nel bytestring package), invece.

In secondo luogo, GHC fino ae includendo la versione 6.12 non restituisce la memoria al sistema operativo. Tuttavia l'imminente GHC 7.0 farà questo, in modo da provare con la ultima release candidate .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top