4

私は、haskellで特殊なHTTPサーバーのような小さなプログラムを作成しました。これは、以下のコードよりもそれほど複雑ではありません。私を困惑させるのは、そのメモリ消費です。たとえば、同封のコードからコンパイルされたテストを実行し、最大20Mbの本体を含むいくつかのPOSTリクエストを行うと、プログラム全体のVMサイズは約800Mbになり、これは奇妙に聞こえます。そして、そのようなプログラムのインスタンスをアイドル状態のままにしておくと、このスペースはシステムに戻されません。

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


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
4

1 に答える 1

8

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

次に、バージョン 6.12 までの GHC はメモリを OS に返しません。ただし、今後のGHC 7.0でこれが行われるため、最新のリリース候補で試してください。

于 2010-11-02T21:52:36.880 に答える