Pregunta

Me escribió un pequeño programa, tipo de servidor HTTP especializada en Haskell, que no es mucho más complejo que el código de abajo. Lo que me extraña es su consumo de memoria. Por ejemplo, cuando corro una prueba compilado desde el código cerrado y hacer varias solicitudes POST que contienen hasta 20 Mb cuerpo todo el programa tendrá el tamaño de VM ~ 800 Mb y esto suena extraño. Y este espacio no se devuelve al sistema si dejo una instancia de dicha inactividad ejecutando el programa.

¿Qué significa esto?


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
¿Fue útil?

Solución

En primer lugar, usted está utilizando String. Esta es una representación ineficiente para una gran cantidad de datos; el costo es algo así como 20 bytes por carácter. Debe utilizar ByteString (en los módulos Data.ByteString / Data.ByteString.Char8 en el paquete de bytestring) en su lugar.

En segundo lugar, GHC hasta e incluyendo la versión 6.12 no devuelve la memoria al sistema operativo. Sin embargo, la próxima GHC 7.0 va a hacer esto, a fin de tratar con el última versión candidata .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top