gpt4 book ai didi

java - 高效更新 DelayQueue 中的元素

转载 作者:太空宇宙 更新时间:2023-11-04 06:17:04 26 4
gpt4 key购买 nike

我遇到了与作者类似的问题: DelayQueue with higher speed remove()?

问题:我需要处理连续传入的数据并检查数据是否在之前的某个时间范围内被看到过。因此,我计算传入数据的唯一 ID,并将按 ID 索引的数据添加到 map 中。同时,我将 ID 和超时时间戳存储在 PriorityQueue 中,使我能够有效地检查最新的超时 ID。不幸的是,如果数据在指定的超时之前再次进入,我需要更新存储在 PriorityQueue 中的超时。到目前为止,我只是删除了旧 ID,并重新添加了 ID 和新超时。如果我的 PriorityQueue 元素增长超过 300k,除了耗时的删除方法之外,这种方法效果很好。

可能的解决方案:我只是考虑使用 DelayQueue 来代替,这样可以更容易地等待第一个数据超时,不幸的是我还没有找到一种有效的方法来更新存储在这样的 DelayQueue 中的超时元素,而不会面临与 PriorityQueue 相同的问题:remove 方法!

关于如何以有效的方式解决这个问题(即使对于一个巨大的队列)有什么想法吗?

最佳答案

这实际上听起来很像 Guava Cache ,这是一个并发堆上缓存,支持“在最近一次查找此条目后过期这么长时间”。如果您可以使用第三方库,那么重用它可能是最简单的。

如果做不到这一点,实现使用的方法看起来像这样:它有一个哈希表,因此可以通过它们的键有效地查找条目,但条目也位于并发的自定义链接列表中 - 您不能使用内置库来做到这一点。该链表的顺序是“最近最少访问的在前”。当访问一个条目时,它会被移动到链表的末尾。您经常会查看列表的开头(所有最近最少访问的条目都位于该列表中)并删除早于阈值的条目。

关于java - 高效更新 DelayQueue 中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27948867/

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