2012-10-24 58 views
3

我需要一個大型的數據列表,當在特定位置引用時,這些數據列表將計算(從文件加載和/或在尚未生成的情況下生成它)並保留以供將來使用。這是由綁定到函數的惰性列表驅動的。這些「塊」有時會被加載,但之後從未真正被使用過,同時仍然在代碼中被有效地引用,所以GC不會接受它們。Haskell惰性卸載

由於RAM快速填滿,我想懶惰地卸載這些塊一段時間後,他們什麼都不用。這可能嗎?

+0

你所說的「懶卸」是什麼意思?直到最後一刻才卸載? –

回答

2

您可以通過使用unsafeInterleaveIO讀取數據塊,並定期通過該列表會並消除了未使用的很長一段時間(或者大塊的引用實現這個:使用弱指針作爲@nponeccop建議在評論),但我會選擇一些不依賴GC來管理塊的內存(因爲可預測的內存使用情況對您很重要)。

例如:

import Data.HashTable.IO 

type ChunkMap = BasicHashTable ChunkId (Maybe Chunk) 

newChunkMap :: IO ChunkMap 
getChunk :: ChunkMap -> IO Chunk 
freeUnusedChunks :: ChunkMap -> IO() 

其中getChunk分配用於與mallocfreeUnusedChunks丟失塊存儲器通過表和free小號未使用組塊去。

你甚至可以運行在單獨的線程freeUnusedChunks

freeThread = forever $ do 
       withChunkMapLock $ do 
        freeUnusedChunks map 
        threadDelay 5000000 
+0

我怎麼知道哪些不被使用? – kvanberendonck

+1

將時間戳與每個塊關聯並在每次訪問時對其進行更新。然後,您可以將最後N個時間戳保留在循環緩衝區中,或者使用'freeUnusedChunks'計算它們。 –

+2

弱指針(來自'base'的'System.Mem.Weak')怎麼辦?它們在這裏適合嗎? – nponeccop