私は、実際には容量が10.000.000、負荷率が.75で構築され、いくつかの値をキャッシュするために使用される大規模な(数百万の)ハッシュマップを使用してJavaを起動しています。
キャッシュされた値は時間の経過とともに役に立たなくなります(もうアクセスされなくなります)が、パフォーマンスが低下し始めたときにキャッシュを完全に空にしたい途中で、役に立たない値を削除することはできません。いつそれをするのが良いかをどうやって決めることができますか?
たとえば、容量が1,000万で、0.75の場合、750万の要素に達したときに空にする必要がありますか?いろいろ試してみましたが、分析的なものが欲しいので。
完全にいっぱいになったときにそれをエンピングするとパフォーマンスが向上するという事実をすでにテストしました(ワイプ後の最初の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;
}
保存された値を取得するために使用します。階層的クラスタリングのコンテンツがマージされ、他のコンテンツとの相関値が不要になるため、ハッシュマップを時々ワイプして、内部の不要な値による劣化を回避したいと思います。
を使用するWeakHashMap
と、データがまだ必要な場合でも、予期せずにデータが消去されます。私はそれを制御できません。
ありがとう