내 응용 프로그램에서 일부 캐싱을 구현하려고하는데 C#에서 기본 메모리 캐시를 사용하려고합니다 (이 요구 사항은 작동하지 않을 경우이 요구 사항을 변경할 수 있음). 내 문제는 그 기계에있는 실제 메모리의 최대 양을 초과하고 싶지 않지만, 나는 기본 메모리 캐시에 이러한 제약 조건을 추가 할 수 없다는 것을 이해합니다.LRU 정책을 사용하는 기본 메모리 캐시
일반적으로, 정책은 다음 목적은 새로운 객체가 캐시 최대 양으로 첨가되는 경우가
- 하면 사용 가능한 물리적 메모리 요소가 LRU
내 캐시가 많은 다른 개체를 포함 할 수 있으며이 2-3gb하는 10메가바이트 범위에 따라 제거, 사용에 가까운, 그래서 정말 trim
기능이 동작하지 않습니다.
RAM 사용을 모니터링하는 LRU 캐시를 구현하는 방법에 대한 제안 사항이 있습니까? 그리고 hoppefully 그것은 넷에서 캐시를 사용하여 수행 할 수 있습니까?
편집
나는 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}", 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());
}
}
내 생각에, 내 컴퓨터에 4GB 램이 있고 4 분 내에 채우면 캐시는 LRU 개체를 제거하는 대신 캐시에 더 많은 개체를 추가 할 때 페이지 파일로 스왑됩니다. 슬라이딩 만료에 도달하면 먼저 조치를 취합니다. – aweis
어떻게 대응할 수 있는지에 대한 답변을 업데이트했습니다. 크기 제한은 한도에 도달 한 개체를 덤프합니다. 페이징을 완전히 막을 수는 없습니다. – saarp
일부 reasone의 경우 속성 값이 변경되지 않습니다. 캐시 객체를 인스턴스화 한 후에 캐시 객체를 조사 할 때 한계는 여전히 98입니다! – aweis