问题标签 [lru]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
8155 浏览

c# - 具有 LRU 策略的默认内存缓存

我正在尝试在我的应用程序中实现一些缓存,并且我想使用 C# 中的默认内存缓存(如果它不起作用,可以更改此要求)。我的问题是不想超过我在机器上拥有的最大物理内存量,但据我所知,我无法将这样的约束添加到默认内存缓存中。

一般来说,政策是:

  1. 如果对象已在缓存中 10 分钟且没有请求,则将其删除
  2. 如果一个新对象被添加到缓存中并且可用物理内存的最大数量接近使用,则基于 LRU 删除元素

我的缓存可以包含许多不同的对象,它们的范围从 10mb 到 2-3gb,所以我无法真正让该trim功能正常工作。

关于如何实现监控内存使用情况的 LRU 缓存有什么建议吗?并且希望它可以使用.net中的缓存来完成?

编辑

我添加了一个简单的示例,其中 MemoryCache 被限制为 100Mb 和 20% 的物理内存,但这并没有改变任何东西。我的记忆充满了没有删除缓存条目。请注意,轮询间隔更改为每 5 秒。

0 投票
4 回答
242 浏览

c++ - 以下 lru 代码中的逻辑错误是什么

我想使用以下代码为我的应用程序进行非常简单的 lru 页面替换。buf_rec的第二个和第三个元素的计数器始终具有相同的值,我不明白为什么。

这是我如何使用它

0 投票
3 回答
2541 浏览

c - 简单标量缓存 LRU 实现

我在 cache.c 文件中寻找 LRU 代码,但这是我能找到的唯一代码:

对我来说似乎缺少 LRU 代码,我认为应该将 LRU 算法放在冒号之后。所以如果我错过了什么,你能指出我正确的方向或给我一些提示吗?

非常感谢。

0 投票
0 回答
760 浏览

java - 缓存替换策略,自适应缓存替换的实现

任何人都可以帮助 Java 实现自适应缓存替换算法吗?这是我学士学位的一部分,我对它的理解有真正的问题。我在 EJB 2.0 中使用缓存实现。

0 投票
2 回答
14469 浏览

memcached - LRU 会删除一段时间未使用的条目吗?

当 memcache 中的可用内存已满时,memcache 使用 LRU(最近一次使用)算法来释放内存。我的问题是 LRU 算法是否会更愿意删除一段时间未使用的条目(最近一次使用)而不是过期的项目?即将到期的条目不会在那个确切时刻被删除,而是在下次有人尝试访问它时(AFAIR)。那么 LRU 算法(也)会考虑密钥的到期吗?

0 投票
1 回答
880 浏览

mips - 虚拟内存、LRU 和页面错误 - 作业

我一直在研究以下程序,感觉它缺少一些信息,或者 a) 和 b) 有点诡计:

该循环作为程序的一部分在使用 4KB 页的虚拟内存系统上执行。假设在需要时使用LRU替换算法在内存中选择要替换的页面。标记为“开始”的指令从页面边界开始,循环体包含 4601 对移位指令(sll 和 srl)。

a) 如果内存包含 8 个 4KB 帧,在循环执行期间会发生多少页错误?

b) 如果内存包含 9 个 4KB 帧,在循环执行期间会发生多少页错误?

a) 和 b) 不是 5 个页面错误吗?每次循环有4602条指令,MIPS指令为4B,页面大小为4KB。4KB/4B = 每页 1024 条指令,所以第一次通过循环:

指令 0 - 1023 帧 0 页面错误是

指令 1024 - 2047 帧 1 页面错误 是

指令 2048 - 3071 帧 2 页面错误是

指令 3072 - 4096 帧 3 页面错误是

指令 4096 - 4602 帧 4 页面错误是

因此,当我们在第二次交互中返回循环时,页面还没有被 LRU 策略替换,所以我们可以再次引用它们。为什么 32 次循环迭代的帧数是 8 帧还是 9 帧?

0 投票
1 回答
55 浏览

http - 当缓存达到限制时,浏览器如何清理缓存?

我试图在网上查找此信息,但找不到有关该信息的好信息。你知道描述它是如何工作的吗?1.它是某种LRU算法吗?2.所有浏览器是否共享相同的“清理算法”?

谢谢!谢伊

0 投票
1 回答
2622 浏览

c++ - 提升对散列唯一索引的多索引访问

此代码取自 boost 多索引“mru”示例:

http://www.boost.org/doc/libs/1_46_1/libs/multi_index/example/serialization.cpp

我的代码与 boost::unordered_map 类似,但我真的很想从这个例子中添加 mru 功能。

我想让这段代码尽可能地接近 boost::unordered_map 。对我来说,关键特性是 unordered_map 的 [] 运算符。

main() 的最后几行被打破,每行上方作为评论是我的问题。

在此先感谢所有答案评论。

0 投票
1 回答
1165 浏览

c++ - 为固定大小的多索引多态容器提升多索引

仍在深入研究 C++/boost,因此欢迎任何评论/反馈。

我正在玩 boost::unordered_maps 并使用形状创建了一个多态示例,大约在我(主要)围绕它的时候,我偶然发现了来自 boost multi_index 的 mru 示例。 http://www.boost.org/doc/libs/1_46_1/libs/multi_index/example/serialization.cpp

那时我想。嗯,一个固定大小的多索引多态容器,它将丢弃基于 LRU 的值,这听起来很疯狂,无法实现。

在完成了很多工作之后,我仍然有以下问题。

  1. 在 insert() 中,有没有办法从序列迭代器中获取 hashed_unique 迭代器,以便我可以直接调用擦除?

  2. 有没有更好的方法实现查找?如果我可以只使用键来进行类似 boost::unordered_map 的查找,而不是仅仅为了查找而创建一个虚拟形状,那就太好了。

  3. get<> 的正确路径是什么(请参阅代码中的 XXX 注释)我尝试了所有正确的方法,然后开始尝试随机废话,但没有任何结果。

  4. 我真的很想要一个 [] 运算符,但我认为这是一个方法... shape[cptr1->pos] = cptr1;

  5. 如何从我的 hash_index::iterator 中获取项目(或一般意义上的),打印它当然没有帮助......

p itr $1 = {, std::allocator > > >, boost::multi_index::detail::bucket_array > > >, boost::shared_ptr, long, boost::shared_ptr const*, boost::shared_ptr const&>> = {, std::allocator > > >, boost::multi_index::detail::bucket_array > > >, boost::shared_ptr const*, boost::iterator, long, boost::shared_ptr const*, boost::shared_ptr const& > >> = {, std::allocator > > >, boost::multi_index::detail::bucket_array > > >, boost::shared_ptr const*, boost::iterator, long, boost::shared_ptr const*, boost ::shared_ptr const&> >> = {, std::allocator > > >, boost::multi_index::detail::bucket_array > > >, boost::incrementable, std::allocator > > >, boost::multi_index: :detail::bucket_array > > >, boost::dereferenceable, std::allocator >> >, boost::multi_index::detail::bucket_array > > >, boost::shared_ptr const*, boost::iterator, long, boost::shared_ptr const*, boost::shared_ptr const&> > > >> = { , std::allocator > > >, boost::multi_index::detail::bucket_array > > >, boost::dereferenceable, std::allocator > > >, boost::multi_index::detail::bucket_array > > >, boost::shared_ptr const*, boost::iterator, long, boost::shared_ptr const*, boost::shared_ptr const&> > >> = {, std::allocator >> >, boost::multi_index::detail:: bucket_array > > >, boost::shared_ptr const*, boost::iterator, long, boost::shared_ptr const*, boost::shared_ptr const&> >> = {, long, boost::shared_ptr const*, boost::shared_ptr const&>> = {, long, boost::shared_ptr const*, boost::shared_ptr const&>> = {, long, boost::shared_ptr const*, boost::shared_ptr const&>> = {}, }, }, }, }, }, }, }, }, node = 0x60a010, buckets = 0x7ffffffdd88 }

0 投票
2 回答
3772 浏览

caching - Go 中的线程安全(Goroutine 安全)缓存

问题 1

我正在为我的服务器构建/搜索 RAM 内存缓存层。它是一个简单的 LRU 缓存,需要处理并发请求(都 Gets an Sets)。

我发现https://github.com/pmylund/go-cache声称是线程安全的。

就获取存储的接口而言,这是正确的。但是如果多个 goroutine 请求相同的数据,它们都在检索指向同一内存块的指针(存储在接口中)。如果任何 goroutine 更改了数据,这将不再是非常安全的。

有没有解决这个问题的缓存包?


问题 1.1

如果问题 1的答案是否定的,那么建议的解决方案是什么?
我看到两个选项:

备选方案 1
解决方案:使用 a 将值存储在包装结构中,sync.Mutex以便每个 goroutine 在读取/写入数据之前需要锁定数据。
type cacheElement struct { value interface{}, lock sync.Mutex }
缺点:缓存变得不知道对数据所做的更改,甚至可能已将其从缓存中删除。一个 goroutine 也可能锁定其他 goroutine。

备选方案2
解决方案:制作数据副本(假设数据本身不包含指针)
缺点:每次执行缓存Get 时分配内存,垃圾收集更多。


对不起,多部分问题。但您不必全部回答。如果您对问题 1 有一个好的答案,那对我来说就足够了!