gpt4 book ai didi

multithreading - "Holding"内存中的数据映射

转载 作者:行者123 更新时间:2023-12-02 06:34:34 24 4
gpt4 key购买 nike

我定义了三个数据结构,其中 SLLMObject,分别代表SetListLikeMapByteString:

nouns :: IO [Object]
nouns = liftM LL.words $ B.readFile "nounlist.txt"

obj :: IO ObjectSet
obj = liftM S.fromList nouns

actions :: IO ActionMap
actions = do
n <- nouns
let l = foldl' (\z x -> (x,Sell):(x,Create):z) [] n
return $ M.fromList $
(\(x,y) -> ((x, Verb y []), Out (Verb y []) x)) <$> l

现在我有一个函数将未计算的 Set 和 Map 绑定(bind)到变量 ao。一旦它进入 query,就会通过用户输入接受并处理一个无限循环的查询。通过查找生成适当的响应。

process :: IO ()
process = do
a <- actions
o <- obj
forever $ query "" a o

请记住,我的 map 由 300,000 多个键值对组成:在我的计算机上,调用第一个查询时,第一次评估的初始时间开销大约在 3-5 秒之间;这很好,完全可以预料。随后的所有其他调用都非常灵敏且 react 灵敏,这正是我想要的方式。然而,这只是因为我将这段代码作为一个独立的可执行文件运行,并且有幸留在 processIO () 中。如果我要将此代码(以及未列出的其余随附代码)转换为一个库,以便与 say .. 一个 Snap Framework Web 应用程序 交互,我不一定会拥有这种奢侈。基本上我想说的是:如果我要从 process 中删除 forever,那么评估的 Map 和 Set 肯定会被垃圾收集。事实上,当我从 Snap 应用程序调用该函数时会发生这种情况(我不能保持 forever 因为它会阻止 Snap 应用程序)。来自 Snap 应用程序的每个后续调用都会有相同的 3-5 秒开销,因为它会重新评估有问题的数据结构。


我的问题:

有没有一种简单的方法可以将 Map 和 Set 保存在内存中,以便每次后续查找都很快?我想出的一个想法是运行一个线程,该线程休眠并维护 Map 和 Set 的存储。然而,这对我来说绝对是矫枉过正。我忽略了什么?感谢您忍受我冗长的解释。

注意:我不一定要寻找代码答案、更多建议、忠告等。

最佳答案

您只能在 snaplet 初始化期间评估 objactions 一次并将结果存储在 snaplet 的状态中。

data SnapApp = SnapApp
{ objectSet :: ObjectSet
, actionMap :: ActionMap
}

appInit :: SnapletInit SnapApp SnapApp
appInit = makeSnaplet ... $ do
...
a <- liftIO actions
o <- liftIO obj
return $ SnapApp o a

现在您可以从 snap 的 Handler 访问它们:

someUrlHandler :: Handler SnapApp SnapApp
someUrlHandler = do
a <- gets actionMap
o <- gets objectMap
res <- query a o
...

这保证了 actionsobj 只会被评估一次。

关于multithreading - "Holding"内存中的数据映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22886845/

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