ハスケルでの怠惰な評価が時折スペースリークにつながることが何度もありました。どのようなコードがスペースリークにつながる可能性がありますか?それらを検出するには?そして、プログラマの一部を避けるためには、どのような予防措置を取ることができますか?ハスケルでのスペースリーク
18
A
答えて
12
あなたはおそらく多くの回答を得るでしょう、これは、私はいくつかの '現実世界のアプリケーションをしようとすると遭遇したものです。 私はマルチスレッドといくつかのMVarsを使ってデータを渡しました(MVarはロックされた共有メモリのようなものです)。私の典型的なパターンだった:
a <- takeMVar mvar
putMVar mvar (a + 1)
そして、ちょうど時々、適切な条件は私のような何かをしたが起こったとき:
a <- takeMVar mvar
when (a > 10) ....
問題はMVARの内容は基本的だったということです(0 + 1 + 1 + 1 + ...)...これは100kのような数値にかなり集中していました...このタイプの問題は私のコードではかなり広がっていました。残念なことにマルチスレッドアプリケーションでは、このような問題に陥るのは非常に簡単です。
私は、メモリの消費量に関するデータを生成するモードではHaskellを開始する別のスレッドを開始および停止し、メモリフットプリントが安定であるかどうか探していたんでした何...検出...
4
大規模なデータ構造で再帰を行うときにこの問題が発生しました。構築されたサンクスはあまりにも多くなり、スペースリークが発生します。
ハスケルでは、スペースリークが発生する可能性を常に認識しておく必要があります。反復は存在しないので、基本的に再帰関数は空間リークを生成する可能性があります。
この問題を回避するには、再帰関数をメモするかtail-recursivelyに書き直します。
関連する問題
- 1. ハスケル関数にスペースリークがあることをテストします。
- 2. ダイナミックハスケルのスペースリーク
- 3. スペースリークのあるレイジーツリー
- 4. スペースリークとライターとサム(
- 5. ハスケルでのダイスゲーム
- 6. GHCインタプリタでスペースリークが発生するのは、concat !! nは
- 7. 「!!」の意味ハスケルで
- 8. ハスケル - GHCiのでdiv`
- 9. ハスケル:
- 10. ハスケル:
- 11. ハスケル、:
- 12. ハスケル
- 13. ハスケル
- 14. ハスケル
- 15. ハスケル
- 16. ハスケル
- 17. ハスケル
- 18. ハスケル
- 19. ハスケル
- 20. ハスケル:(!):
- 21. ハスケル
- 22. ハスケル
- 23. ハスケル:
- 24. Control.Lens.PlatedとBoundのインタラクションにおけるスペースリーク/バグ
- 25. ハスケルでのテキストファイルの転置
- 26. ハスケルでのリストの理解
- 27. ハスケルでゼロ除算
- 28. ハスケルでタイプ消去?
- 29. ハスケルでOcamlの「try ... with」
- 30. ハスケルでの構造誘導
エドワード・Z・ヤンの「空間リーク動物園」(http://blog.ezyang.com/2011/05/space-leak-zoo/)を見てください。 –