2011-10-14 14 views
18

ハスケルでの怠惰な評価が時折スペースリークにつながることが何度もありました。どのようなコードがスペースリークにつながる可能性がありますか?それらを検出するには?そして、プログラマの一部を避けるためには、どのような予防措置を取ることができますか?ハスケルでのスペースリーク

+7

エドワード・Z・ヤンの「空間リーク動物園」(http://blog.ezyang.com/2011/05/space-leak-zoo/)を見てください。 –

答えて

12

あなたはおそらく多くの回答を得るでしょう、これは、私はいくつかの '現実世界のアプリケーションをしようとすると遭遇したものです。 私はマルチスレッドといくつかのMVarsを使ってデータを渡しました(MVarはロックされた共有メモリのようなものです)。私の典型的なパターンだった:

a <- takeMVar mvar 
putMVar mvar (a + 1) 

そして、ちょうど時々、適切な条件は私のような何かをしたが起こったとき:

a <- takeMVar mvar 
when (a > 10) .... 

問題はMVARの内容は基本的だったということです(0 + 1 + 1 + 1 + ...)...これは100kのような数値にかなり集中していました...このタイプの問題は私のコードではかなり広がっていました。残念なことにマルチスレッドアプリケーションでは、このような問題に陥るのは非常に簡単です。

私は、メモリの消費量に関するデータを生成するモードではHaskellを開始する別のスレッドを開始および停止し、メモリフットプリントが安定であるかどうか探していたんでした何...検出...

Anotomy of a thunk leak (with instructions how to debug it)

例:Thunk memory leak as a result of map function

4

大規模なデータ構造で再帰を行うときにこの問題が発生しました。構築されたサンクスはあまりにも多くなり、スペースリークが発生します。

ハスケルでは、スペースリークが発生する可能性を常に認識しておく必要があります。反復は存在しないので、基本的に再帰関数は空間リークを生成する可能性があります。

この問題を回避するには、再帰関数をメモするかtail-recursivelyに書き直します。