unsafeInterleaveIO
を使用してチャンクを読み取り、定期的にリストを調べて、長い間使用されていなかったチャンクへの参照を削除することでこれを実装できます(または、 @nponeccopがコメントで示唆しているように弱いポインターを使用します)。チャンクのメモリを管理するためにGCに依存しないものを使用します(予測可能なメモリ使用量が重要であるため)。
例えば:
import Data.HashTable.IO
type ChunkMap = BasicHashTable ChunkId (Maybe Chunk)
newChunkMap :: IO ChunkMap
getChunk :: ChunkMap -> IO Chunk
freeUnusedChunks :: ChunkMap -> IO ()
不足しているチャンクにメモリをgetChunk
割り当て、テーブルと未使用のチャンクを調べます。malloc
freeUnusedChunks
free
freeUnusedChunks
別のスレッドで実行することもできます。
freeThread = forever $ do
withChunkMapLock $ do
freeUnusedChunks map
threadDelay 5000000