标签: lru

具有LRU策略的默认内存缓存

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

通常,该策略是:

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

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

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

编辑

我添加了一个简单的示例,其中MemoryCache限制为100Mb和物理内存的20%,但这不会改变任何内容。我的内存已满,无法删除缓存条目。请注意,轮询间隔更改为外翻5秒。

class Item
{
    private List<Guid> data;

    public Item(int capacity)
    {
        this.data = new List<Guid>(capacity);
        for (var i = 0; i < capacity; i++)
            data.Add(Guid.NewGuid());
    }
}

class Program
{
    static void Main(string[] args)
    {
        var cache = new MemoryCache(
            "MyCache",
            new NameValueCollection
            {
                { "CacheMemoryLimitMegabytes", "100" },
                { "PhysicalMemoryLimitPercentage", "20" },
                { "PollingInterval", "00:00:05" }
            });

        for (var i = 0; i < 10000; i++)
        {
            var key = String.Format("key{0}", …
Run Code Online (Sandbox Code Playgroud)

c# caching memory-management lru

5
推荐指数
1
解决办法
7093
查看次数

限制std :: set的大小

我有一个关于std :: set容器的简短问题.现在我正在使用pushback功能来提供我的设置.对于每个push_back,该集合变得越来越大.我只对最新的30个元素感兴趣......可以删除旧元素.所以我的想法是将集合的大小限制为30个元素左右,并通过这样做摆脱不需要的旧元素.但是,默认情况下,该集不支持限制.我可以偶尔检查一下这个集的大小,然后手动删除多余的元素.有更聪明的方法吗?

关心Lumpi

c++ lru stdset

4
推荐指数
2
解决办法
2690
查看次数

3
推荐指数
1
解决办法
2万
查看次数

memcached 中的延迟过期机制是如何运作的?

(首先,我的英文不是很好,拜托了)

众所周知,memcached 提供延迟到期,并“替换”其slab 中的LRU 数据,但是我不太清楚它是如何做到这一点的。例如,如果一个slab已经满了,但是这个slab中的一些数据已经过期了,那么当数据被添加到slab时会发生什么?

  1. memcached 是否找到一些过期的数据并用添加的数据替换它们,或者
  2. 它是否替换了 LRU 数据,或者
  3. 它会做其他事情吗?

据我所知,延迟过期是这样的,memcached 不会主动从每个平板中删除过期数据,而是仅在引用过期条目的键时删除过期条目。这是一种资源浪费,不是吗?

memcached lru

3
推荐指数
1
解决办法
4353
查看次数

如何在elisp中实现过期的LRU缓存?

我的数据包含以下三个组件:

  • a_path
  • a_key
  • a_value =f(a_path, a_key)

a_value计算起来很昂贵,所以我想不经常计算它.在一个理想的世界中,只有当它发生变化时才会这样.所以,我对这个缓存的要求如下:

  • 具有可配置最大大小的LRU缓存
  • 键入 (a_path, a_key)
  • 能够根据年龄使条目到期(例如,每小时左右重新计算)
  • 基于的能力使条目到期 expiry_func(a_path, a_key)

我的谷歌搜索在这里失败了; 即使在搜索"elisp LRU缓存"时,我也发现了很多Java站点.

caching elisp lru

3
推荐指数
1
解决办法
405
查看次数

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

问题1

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

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

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

是否有任何可以解决此问题的缓存程序包?


问题1.1

如果对问题1的回答为,那么建议的解决方案是什么?
我看到两个选择:

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

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


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

caching interface thread-safety go lru

3
推荐指数
1
解决办法
1965
查看次数

Java LinkedHashMap 与removeEldestEntry 导致java.lang.NullPointerException

错误看起来像这样

Exception in thread "Thread-1" java.lang.NullPointerException
    at java.util.LinkedHashMap$Entry.remove(LinkedHashMap.java:332)
    at java.util.LinkedHashMap$Entry.recordAccess(LinkedHashMap.java:356)
    at java.util.LinkedHashMap.get(LinkedHashMap.java:304)
    at Server.getLastFinishedCommands(Server.java:9086)
    at Server.processPacket(Server.java:484)
    at PacketWorker.run(PacketWorker.java:34)
    at java.lang.Thread.run(Thread.java:744)
Run Code Online (Sandbox Code Playgroud)

里面getLastFinishedCommands我用

   public List<CCommand> getLastFinishedCommands(UserProfile player) {
        List<CCommand> returnList = new ArrayList<CCommand>();

        if(!finishedCommands.containsKey(player.myWebsitecmd-1)) {
            getSavedState(player);
            return null;
        }

        try { //<-- added this try/catch so it doesn't happen again.
            //Get commands.
            CCommand cmd;
            long i;
            long startIndex = player.myWebsitecmd;
            long endIndex = startIndex+LIMIT_COMMANDS;

            for(i = startIndex; i <= endIndex; i++) {
                cmd = finishedCommands.get(i);   //<-- this is line 9086 …
Run Code Online (Sandbox Code Playgroud)

java dictionary get linkedhashmap lru

3
推荐指数
1
解决办法
2075
查看次数

node.js / LRU 缓存包 - max 参数

我开始使用LRU 缓存包。

选项参数之一是 max - 缓存的最大大小。

不明白这个参数是什么意思?是缓存的大小还是缓存中每个文件的大小?是字节吗?知识库?当缓存大小达到这个最大大小时,会发生什么?

caching lru node.js

3
推荐指数
1
解决办法
1169
查看次数

Python的OrderedDict如何记住插入的元素?

OrderedDict在Python中如何记住元素的所有顺序?性能开销是多少?对于诸如实现之类的问题LRU,我发现它确实非常强大且易于实现,但是这里的性能提升是多少?如何记住最初插入的键的顺序?

它是否使用Dict()Double Linked List来记住下图所示的键?如果您能用一种简单的语言传达信息而不是分享某种研究论文,我将不胜感激。

在此处输入图片说明

python collections dictionary ordereddictionary lru

3
推荐指数
1
解决办法
431
查看次数

为什么当 maxsize 是 2 的幂时 python lru_cache 性能最好?

文档是这样说的:

如果 maxsize 设置为 None,则禁用 LRU 功能,缓存可以无限制地增长。当 maxsize 是 2 的幂时,LRU 功能表现最佳。

有人会碰巧知道这个“二的幂”从何而来?我猜它必须对实现做些什么。

caching lru python-3.x

3
推荐指数
2
解决办法
1845
查看次数