Haskell(GHC)ランタイムメモリの使用法または私は何を間違えますか
-
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はこれを行いますので、 最新リリース候補.
所属していません StackOverflow