Удаление самого старого элемента из словаря - PullRequest
2 голосов
/ 08 ноября 2011

Я работаю с приложением WPF, задачей которого является отображение большого количества растровых файлов. В будущем я планирую реализовать решение с использованием векторной графики, но сейчас у меня есть эта проблема:

Чтобы минимизировать время, в течение которого мое приложение читает файлы с диска, я создал Dictionary<string, BitmapImage> (где строка - путь к файлу изображения) для хранения наиболее часто используемых изображений. Если запрашивается изображение, которое было просмотрено недавно, программа получает его с Dictionary, а не с диска. Однако с ростом количества просматриваемых изображений увеличивается объем оперативной памяти, используемой программой. Поэтому моя идея заключалась в том, чтобы хранить ограниченное количество изображений, и, поскольку новое загружается с диска, перезаписать самое старое из моих Dictionary.

Как бы я поступил так, как можно лучше? Я рассмотрел использование SortedDictionary, но не могу понять, как написать IComparer, поскольку ни keys, ни items не имеют никакой информации о времени / порядке их добавления.

Будет ли разумным решение сохранить отдельный SortedDictionary<DateTime, string> с DateTime IComparer? Таким образом, при добавлении нового файла можно найти путь к самому старому добавленному файлу и сопоставить его с правильным изображением в моем Dictionary. Это похоже на продвинутое решение. Какие-нибудь упущенные или встроенные решения?

Ответы [ 4 ]

4 голосов
/ 08 ноября 2011

Звучит так, как будто вы хотите кэш с наименьшим количеством использовавшихся (LRU) ("сначала отбрасывает наименее использованные элементы").В Интернете есть несколько реализаций:

2 голосов
/ 08 ноября 2011

Если вы находитесь в .NET 4, есть встроенный механизм кэширования - пошаговое руководство см. http://msdn.microsoft.com/en-us/library/dd997362.aspx

. Позволяет вам установить условия, когда соответствующий кэшированный элемент отбрасывается и т. Д. и допускает обратный вызов в случае, если элемент собирается удалить (см. http://msdn.microsoft.com/en-us/library/system.runtime.caching.cacheitempolicy.aspx).

. Вы можете реализовать описанную вами политику кэширования (она называется LRU - наименее недавно использованная *).1010 *) с помощью CacheItemPolicy.SlidingExpiration .

1 голос
/ 08 ноября 2011

Я бы посоветовал вам упростить задачу и создать словарь в словаре.

Например:

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

Я не уверен, как и если отсортированный словарь сортирует правильные даты, но если это так, и самая старая запись равна последней записи, у вас довольно легко удалить эту запись.

0 голосов
/ 25 апреля 2015

Я бы предложил использовать словарь и вместо этого использовать List с пользовательским классом, который принимает растровое изображение, строку и DateTime, что-то вроде:

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

Тогда вы можете использовать List<ImageLocation> для хранения ваших изображений. Сортируйте их по timeLoaded, а затем удалите тот, у которого самый ранний DateTime.

То есть, если вы по какой-то причине не собираетесь использовать кэш LRU.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...