【问题标题】:Rush - memoize issuesRush - 记忆问题
【发布时间】:2023-02-04 04:57:25
【问题描述】:

我有一个正在尝试编码的游戏,我想记住一个 next_guess 函数,因为它很昂贵。我知道有一些记忆箱,但我有一些奇怪的要求,整个项目都是学习 Rust 的练习,所以我想知道真正的 Rustacean 会怎么想。 next_guess函数在Node structimpl中。游戏树的分支非常快,所以每个级别都有几十个可能的下一步节点来分析。如果我将对 memoize HashMap 的引用添加到 Node struct 以供 next_guess 使用,我不能使其可变,因为不能有多个对它的可变引用。但我需要它是可变的,这样我才能添加新的值。我认为使用全局变量是一个禁忌,但是将 HashMap 设置为 lazy_static 是正确的方法,还是我应该使用 unsafe 块来访问它(我可以这样做吗?)。谢谢

【问题讨论】:

  • 访问HashMap 是多线程的吗?如果不是,您可以将它放在 RefCell 中,以便它可以在共享引用后面发生变异?否则,也许您可​​以将它放在 MutexRwLock 中,以便同步跨线程的访问(并且,同样,共享引用后面可能会发生突变);但是存在更有效的解决方案,包括parking_lot

标签: rust memoization


【解决方案1】:

只是我的两分钱:

  • 在每个Node 中包含一个HashMap 会占用大量空间。
  • 如果您手边已有特定的Node,您真的要在HashMap中查找吗? Node 本身不能存储缓存值(可能在 Option<BestNextGuess> 中吗?

【讨论】:

  • 抱歉,我不清楚。目前每个节点都包含一个next_guess函数,但是HashMap需要共享和通用。如果我使用的是 memoize crate,我会从 Node impl 中提取 next_guess 函数,但逻辑上它属于那里。如果在 C 中实现,我会将 HashMap 设为全局,这样所有节点都可以访问它。
  • next_guess的签名是什么? HashMap 的类型是什么?
【解决方案2】:

我最终重构以创建一个拥有HashMap 的游戏struct,然后在调用节点struct 之前首先通过游戏struct 传递所有猜测尝试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-13
    • 2013-08-14
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 2011-02-03
    相关资源
    最近更新 更多