3

特定の場所で参照されたときに計算され(ファイルからロードされるか、まだ生成されていない場合は生成される)、将来の使用のために保持されるデータの大規模なリストが必要です。これは、関数にバインドされたレイジーリストによって強化されています。これらの「チャンク」はロードされることがありますが、その後は実際には使用されませんが、コードで効果的に参照されるため、GCはそれらを取得しません。

RAMがすぐにいっぱいになるので、何も使用されていない期間が経過した後、これらのチャンクを遅延アンロードしたいと思います。これは可能ですか?

4

1 に答える 1

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割り当て、テーブルと未使用のチャンクを調べます。mallocfreeUnusedChunksfree

freeUnusedChunks別のスレッドで実行することもできます。

freeThread = forever $ do
                 withChunkMapLock $ do
                     freeUnusedChunks map
                     threadDelay 5000000
于 2012-10-24T10:04:08.837 に答える