Я работаю на Java с большой (миллионами) хэш-картой, которая на самом деле построена с емкостью 10.000.000 и коэффициентом загрузки 0,75, и она используется для кэширования некоторых значений
, поскольку кэшированные значения со временем становятся бесполезными (к ним больше нет доступа), но я не могу удалить бесполезные, когда я хочу полностью очистить кэш, когда его производительность начинает ухудшаться. Как я могу решить, когда это хорошо делать?
Например, с емкостью 10 миллионов и 0,75 я должен опустошить его, когда он достигнет 7,5 миллионов элементов? Потому что я пробовал различные пороговые значения, но хотел бы иметь аналитическое значение.
Я уже проверял тот факт, что очистка его, когда он полностью заполнен, повышает производительность (первые 2-3 итерации алгоритма после очистки просто заполняют его обратно, затем он начинает работать быстрее, чем до очистки)
РЕДАКТИРОВАТЬ: ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ
Хэш-карта имеет длинные ключи и значения с плавающей запятой. Он содержит кешированную корреляцию содержимого, поскольку это точечный продукт векторов тегов, который я хотел кэшировать (для повышения производительности).
Итак, в основном я вычисляю ключ long
, используя хэш-коды 2 содержимого:
static private long computeKey(Object o1, Object o2)
{
int h1 = o1.hashCode();
int h2 = o2.hashCode();
if (h1 < h2)
{
int swap = h1;
h1 = h2;
h2 = swap;
}
return ((long)h1) << 32 | h2;
}
и использовать его для извлечения сохраненных значений. Что происходит, так как это иерархическое кластеризованное содержимое объединяется и его значения корреляции с другим содержимым больше не нужны ... поэтому я хочу время от времени стирать хэш-карту, чтобы избежать ухудшения из-за бесполезных значений внутри него. 1019 *
Использование WeakHashMap
приведет к непредсказуемому уничтожению данных, даже если они все еще необходимы. Я не могу их контролировать.
Спасибо