我正在使用一个负责显示大量位图文件的WPF应用程序。将来我计划使用矢量图形来实现解决方案,但是现在我遇到了这个问题:
为了最小化我的应用程序从磁盘读取文件的时间,我创建了一个Dictionary<string, BitmapImage>
(其中string是图像的文件路径)来保存最近使用的图像。如果请求最近查看过的图像,程序将从Dictionary
而不是从磁盘中获取该图像。但是,随着查看的图像数量的增加,程序使用的RAM量也会增加。所以我的想法是持有有限数量的图像,并且当从磁盘加载新图像时,覆盖我Dictionary
中最旧的图像。
我怎样才能以最好的方式做到这一点?我已经考虑使用SortedDictionary
但无法弄清楚如何编写IComparer
,因为keys
或items
都没有关于时间/顺序的任何信息加入了。
将单独的SortedDictionary<DateTime, string>
与DateTime IComparer
保持一致是一个明智的解决方案吗?这样,当添加新文件时,可以找到最早添加的文件的路径,并与我Dictionary
中的正确图像匹配。这种感觉就像一个先进的解决方案。任何被忽视或内置的解决方案?
答案 0 :(得分:4)
听起来你想要一个least recently used (LRU) cache(“首先丢弃最近最少使用的项目”)。网上有一些实现:
答案 1 :(得分: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)。
您可以使用LRU - least recently used实现您所描述的缓存策略(称为CacheItemPolicy.SlidingExpiration)。
答案 2 :(得分:1)
我建议您自己轻松一点,并在字典中创建字典。
例如:
Dictionary<DateTime, Dictionary<string, Image>> SortedByDate;
我不确定排序字典是如何以及是否排序正确的日期,但如果确实如此,最旧的等于最后一个条目,您可以很容易地删除该条目。
答案 3 :(得分:0)
我建议不要使用字典,而是使用带有自定义类的List,该类带有位图,字符串和DateTime,如:
public Class ImageLocation{
public BitmapImage image;
public string location;
public DateTime timeLoaded;
}
然后您可以使用List<ImageLocation>
来存储图片。按timeLoaded对它们进行排序,然后删除具有最早DateTime的那个。
也就是说,如果由于某种原因你不打算使用LRU缓存。