Haskell(GHC)ランタイムメモリの使用法または私は何を間違えますか

StackOverflow https://stackoverflow.com/questions/4082375

  •  28-09-2019
  •  | 
  •  

質問

Haskellには、小さなプログラム、種類の専門のHTTPサーバーを書きました。これは、以下のコードよりもはるかに複雑ではありません。私を困惑させるのは、その記憶消費です。同封のコードからコンパイルされたテストを実行し、最大20MBのボディプログラム全体のVMサイズを含むいくつかの投稿リクエストを作成すると、これは奇妙に聞こえます。そして、このようなプログラムのインスタンスを実行している場合、このスペースはシステムに返されません。

これは何を意味するのでしょうか?


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
役に立ちましたか?

解決

まず、使用しています String. 。これは、多くのデータの非効率的な表現です。コストは、文字あたり20バイトのようなものです。使用する必要があります ByteString (の中に Data.ByteString / Data.ByteString.Char8 パッケージ内のモジュール bytestring) 代わりは。

第二に、バージョン6.12までのGHCはOSにメモリを返しません。ただし、今後のGHC 7.0はこれを行いますので、 最新リリース候補.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top