В моем приложении я использую словарь (поддерживающий добавление, удаление, обновление и поиск), где оба ключа и значения могут быть или могут быть сериализованы (значения могут быть довольно крупными объектными графами). Я пришел к тому, что словарь стал настолько большим, что его полностью в памяти начали иногда запускать OutOfMemoryException
(иногда в словарных методах, а иногда и в других частях кода).
После попытки полностью заменить словарь базой данных производительность снизилась до неприемлемого уровня.
Анализ шаблонов использования словаря показал, что обычно меньшая часть значений является "горячей" (к ней часто поступают), а остальные (большая часть) "холодны" (редко или никогда не обращаются). Трудно сказать, когда добавляется новое значение, если оно будет горячим или холодным, более того, некоторые значения могут перемещаться вперед и назад между горячими и холодными частями с течением времени.
Я думаю, что мне нужна реализация словаря, способного сбросить свои холодные значения на диск при событии с низкой памятью, а затем перезагрузить некоторые из них по требованию и сохранить их в памяти до тех пор, пока не произойдет следующее событие с низкой памятью когда их статус "горячий/холодный" будет пересмотрен. В идеале, реализация должна аккуратно регулировать размеры его горячих и холодных деталей и интервал смыва в зависимости от профиля использования памяти в приложении, чтобы максимизировать общую производительность. Поскольку в приложении существует несколько экземпляров словаря (с разными типами ключей/значений), им может потребоваться скоординировать их рабочие процессы.
Не могли бы вы предложить, как реализовать такой словарь?