gpt4 book ai didi

c# - 使用 LRU 策略的默认内存缓存

转载 作者:太空狗 更新时间:2023-10-29 23:25:24 28 4
gpt4 key购买 nike

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

一般来说,政策是:

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

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

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

编辑

我添加了一个简单示例,其中 MemoryCache 限制为 100Mb 和物理内存的 20%,但这并没有改变任何东西。我的内存充满了没有删除的缓存条目。请注意,轮询间隔更改为 evert 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}", i);
Console.WriteLine("Add item: {0}", key);
cache.Set(key, new Item(1000000), new CacheItemPolicy() { UpdateCallback = UpdateHandler } );
}

Console.WriteLine("\nDone");
Console.ReadKey();
}

public static void UpdateHandler(CacheEntryUpdateArguments args)
{
Console.WriteLine("Remove: {0}, Reason: {1}", args.Key, args.RemovedReason.ToString());
}
}

最佳答案

看起来像 System.Runtime.Caching.MemoryCache类(class)很适合这个法案。您在每个项目的基础上设置缓存策略,因此如果您添加一个缓存策略为 SlidingExpiration 且 TimeSpan 为 10 分钟的项目,您应该会得到您正在寻找的行为。

这只是一个 .Net v4 类,因此在早期的运行时版本中不存在。如果您在 Web 上下文中,ASP.Net 缓存的行为类似,但可能不会让您管理系统信息。

您可以在创建缓存时设置缓存大小限制,使其不会超过特定的内存占用量:

var myCache = new MemoryCache( 
"MyCache",
new NameValueCollection { { "PhysicalMemoryLimit", "50" }} // set max mem pct
);

这应该可以防止对磁盘进行任何分页,至少在您的应用程序中是这样。如果存在外部内存压力或系统过度积极地将内存分页到磁盘,您的缓存可能仍会被分页,但不是由于应用程序中的过度使用。据我所知,在 C# 中无法保留内存页。

关于c# - 使用 LRU 策略的默认内存缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9653696/

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