gpt4 book ai didi

Haskell 延迟卸载

转载 作者:行者123 更新时间:2023-12-02 16:56:20 26 4
gpt4 key购买 nike

我需要有一个大的数据列表,当在特定位置引用时,这些数据会进行计算(从文件加载,和/或如果尚未生成则生成它)并保留以供将来使用。这是由绑定(bind)到函数的惰性列表提供支持的。这些“ block ”有时会被加载,但之后从未真正使用过,同时仍然在代码中有效引用,因此 GC 不会识别它们。

由于 RAM 很快就填满了,我想在一段时间没有使用这些 block 后,懒惰地卸载它们。这可能吗?

最佳答案

您可以通过使用 unsafeInterleaveIO 读取 block 并定期遍历列表并删除对长时间未使用的 block 的引用来实现此目的(或者:使用弱指针作为 @nponeccop 在评论中建议),但我会选择不依赖 GC 来管理 block 内存的东西(因为可预测的内存使用对您来说很重要)。

例如:

import Data.HashTable.IO

type ChunkMap = BasicHashTable ChunkId (Maybe Chunk)

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

其中 getChunk 使用 malloc 为丢失的 block 分配内存,freeUnusedChunks 遍历表并释放 free未使用的 block 。

您甚至可以在单独的线程中运行freeUnusedChunks:

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

关于Haskell 延迟卸载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13045820/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com