2011-10-14 28 views
18

我已經讀過很多次,對Haskell的懶惰評估有時會導致空間泄漏。什麼樣的代碼會導致空間泄漏?如何檢測它們?部分程序員可以採取哪些預防措施來避免它們?Haskell中的空間泄漏

+7

看看Edward Z. Yang的[Space leak zoo](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) .... 

的問題是無功的內容基本上是(0 + 1 + 1 + 1 + ....)...對於像100k這樣的數字來說非常密集...這種類型的問題在我的代碼中非常普遍;不幸的是對於多線程應用程序來說,很容易發現這些問題。

檢測......我所做的是在開始產生關於內存消耗,啓動和停止不同的線程和尋找,如果內存佔用的穩定與否數據模式哈斯克爾...

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

例如:Thunk memory leak as a result of map function

4

我在大數據結構上進行遞歸時遇到了這個問題。內置的thunk太多,然後你得到一個空間泄漏。

在Haskell中,您需要不斷地意識到碰到空間泄漏的可能性。由於迭代不存在,基本上任何遞歸函數都有可能產生空間泄漏。

爲了避免此問題,請記住遞歸函數,或者以遞歸方式重寫它們。