Frage

Ich schrieb ein kleines Programm, Art von spezialisierten HTTP-Server in Haskell, die unten nicht viel komplexer als der Code ist. Was mir ein Rätsel ist sein Speicherverbrauch. Sprich, wenn ich einen Test laufen aus dem beiliegenden Code kompiliert und machen mehrere POST-Anfragen, die bis zu 20 MB Körper ganze Programm VM Größe von ~ 800 Mbit haben und diese seltsame Geräusche. Und dieser Raum ist nicht auf System zurückgegeben, wenn ich eine Instanz eines solchen Programms läuft im Leerlauf lassen.

Was bedeutet das?


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
War es hilfreich?

Lösung

Zum einen sind Sie mit String. Dies ist eine ineffiziente Darstellung für viele Daten; die Kosten sind so etwas wie 20 Byte pro Zeichen. Sie sollten ByteString (in dem Data.ByteString / Data.ByteString.Char8 Module im Paket bytestring) stattdessen verwenden.

Zweitens GHC bis einschließlich Version 6.12 Speicher nicht an das Betriebssystem zurück. Doch die kommende GHC 7.0 wird dies tun, versuchen Sie so mit der neuesten Release Candidate .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top