2012-03-11 2 views
4

내 응용 프로그램에서 일부 캐싱을 구현하려고하는데 C#에서 기본 메모리 캐시를 사용하려고합니다 (이 요구 사항은 작동하지 않을 경우이 요구 사항을 변경할 수 있음). 내 문제는 그 기계에있는 실제 메모리의 최대 양을 초과하고 싶지 않지만, 나는 기본 메모리 캐시에 이러한 제약 조건을 추가 할 수 없다는 것을 이해합니다.LRU 정책을 사용하는 기본 메모리 캐시

일반적으로, 정책은 다음 목적은 새로운 객체가 캐시 최대 양으로 첨가되는 경우가

  • 을 제거없이 요청을 10 분 동안 캐시되었습니다

    1. 하면 사용 가능한 물리적 메모리 요소가 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()); 
        } 
    } 
    
  • 답변

    4

    System.Runtime.Caching.MemoryCache 클래스가이 청구서에 잘 어울리는 것 같습니다. 캐시 정책은 항목별로 설정되므로 캐시 정책이 SlidingExpiration 인 항목을 TimeSpan이 10 분인 항목을 추가하는 경우 찾고자하는 동작을 가져와야합니다.

    이것은 .Net v4 클래스 전용이므로 이전 런타임 버전에는 존재하지 않습니다. 웹 컨텍스트에있는 경우 ASP.Net 캐시도 비슷하게 동작하지만 시스템 정보를 관리 할 수는 없습니다. 이것은 적어도 응용 프로그램 내 디스크에있는 페이징을 방지한다

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

    : 그것은 특정 메모리 사용량을 초과하지 않도록

    당신은 당신이 그것을 만들 캐시 크기에 대한 제한을 설정할 수 있습니다. 외부 메모리가 부족하거나 시스템이 디스크로 메모리를 페이징하는 데 지나치게 공격적 일 경우 캐시가 페이징 될 수 있지만 응용 프로그램 내에서 과도하게 사용되지는 않습니다. 내 지식에 C#에서 메모리 페이지를 예약 할 방법이 없습니다.

    +0

    내 생각에, 내 컴퓨터에 4GB 램이 있고 4 분 내에 채우면 캐시는 LRU 개체를 제거하는 대신 캐시에 더 많은 개체를 추가 할 때 페이지 파일로 스왑됩니다. 슬라이딩 만료에 도달하면 먼저 조치를 취합니다. – aweis

    +0

    어떻게 대응할 수 있는지에 대한 답변을 업데이트했습니다. 크기 제한은 한도에 도달 한 개체를 덤프합니다. 페이징을 완전히 막을 수는 없습니다. – saarp

    +0

    일부 reasone의 경우 속성 값이 변경되지 않습니다. 캐시 객체를 인스턴스화 한 후에 캐시 객체를 조사 할 때 한계는 여전히 98입니다! – aweis