2011-11-08 3 views
2

많은 양의 비트 맵 파일을 표시하는 WPF 응용 프로그램과 함께 작업하고 있습니다. 앞으로 벡터 그래픽을 사용하여 솔루션을 구현할 계획이지만, 현재이 문제가 있습니다 :사전에서 가장 오래된 항목 제거

응용 프로그램이 디스크에서 파일을 읽는 시간을 최소화하기 위해 Dictionary<string, BitmapImage> (여기서 string은 이미지의 파일 경로 임) 가장 최근에 사용한 이미지를 유지합니다. 최근에 본 이미지가 요청되면 프로그램은 디스크 대신 Dictionary에서 이미지를 가져옵니다. 그러나 볼 수있는 이미지 수가 늘어 나면 프로그램에서 사용하는 RAM의 양도 늘어납니다. 그래서 내 아이디어는 제한된 양의 이미지를 보유하고 있었고 새 디스크가 디스크에서로드 될 때 가장 오래된 것을 덮어 씁니다. Dictionary.

가능하면 어떻게하면 좋을까요? 나는 SortedDictionary을 사용해 보았지만, 으로 쓰는 방법을 알아낼 수 없으며, keys 또는 items에는 추가 된 시간/순서에 대한 정보가 없습니다.

SortedDictionary<DateTime, string>DateTime IComparer으로 유지하는 것이 합리적인 해결책일까요? 이렇게하면 새 파일을 추가하면 가장 오래된 추가 파일의 경로를 찾을 수 있고 Dictionary에있는 올바른 이미지와 일치시킬 수 있습니다. 이런 종류의 고급 솔루션을 생각하지만. 간과되거나 내장 된 솔루션은 무엇입니까?

답변

4

least recently used (LRU) cache ("최근 사용 빈도가 가장 적은 항목을 먼저 삭제")하려는 것 같습니다. 웹 주위에 떠있는 몇 가지 구현이 있습니다

+0

Bob Rossney가 사용하겠습니다. 내 자신의 평범한 것을 만드는 것보다 좋은 것을 사용하는 것이 낫습니다; P 고마워요! – Tobbe

0

나는 스스로를 쉽게 만들고 사전으로 사전을 만드는 것이 좋습니다. 예를 들어

:

Dictionary<DateTime, Dictionary<string, Image>> SortedByDate; 

내가 정렬 된 사전이 정확한 날짜를 정렬하지만이하는 가장 오래된 마지막 항목을 동일한 경우 당신이 가지고있는 경우는 매우 쉽게 그 항목을 제거하는 방법과 확신입니다.

+0

더 이상 경로 (문자열)로 검색 할 수 없지만 그렇습니까? – ssube

+0

고마워, 그걸 시험해 볼게! http://stackoverflow.com/questions/453124/datetime-as-key-in-a-sorteddictionaryk-v에 따르면'DateTime'은 키로 작동해야합니다. – Tobbe

+0

@peachykeen 그것에 대해 생각하지 않았어! 나는 더 자세히 살펴볼 것이다. – Tobbe

2

내장 캐시 메커니즘이 당신이 .NET 4에있는있는 경우 - 연습에 대한이 http://msdn.microsoft.com/en-us/library/dd997362.aspx

It allows you to set conditions when the respective cached item is discarded etc.을보고이 항목이 (http://msdn.microsoft.com/en-us/library/system.runtime.caching.cacheitempolicy.aspx 참조) 제거하려 할 경우 콜백 수 있습니다.

CacheItemPolicy.SlidingExpiration을 사용하여 설명한 캐시 정책 (LRU - least recently used이라고 함)을 구현할 수 있습니다.

+0

감사합니다. 그러나 3.5에 있습니다. 나는 그 이상의 모험을 염두에두고 생각할 것이다! – Tobbe

0

내가 사용 사전에 제안, 대신 것 같은 비트 맵, 문자열 및 날짜 시간, 뭔가 걸리는 사용자 정의 클래스 목록 :

public Class ImageLocation{ 
    public BitmapImage image; 
    public string location; 
    public DateTime timeLoaded; 
} 

그런 다음 당신은사용할 수 있습니다귀하의 이미지를 저장합니다. timeLoaded로 정렬 한 다음 가장 오래된 DateTime으로 제거하십시오.

즉, 어떤 이유로 LRU 캐시를 사용하지 않을 경우입니다.

관련 문제