Id マッピング キャッシュがメモリを消費しすぎています。オブジェクトの 3 つの異なるタイプの Id の組み合わせを格納するために使用され、それらのマッピングがテーブルから読み込まれ、1 つの Id タイプから別のタイプへの迅速な検索/変換のために 6 つの異なる辞書にキャッシュされます (パフォーマンスは私のアプリケーションにとって重要です)。
メモリ フットプリントが小さいものに書き直したかったので、ID の統合リストを実装し、linq/lambda 式を使用して必要な値を引き出しました。とりあえずこんな感じ。
public struct IdMappings
{
public int Id1;
public int Id2;
public int Id3;
}
//new cache
private static List<IdMappings> AllIdMappings = null;
//current cache implementation
private static Dictionary<int, int> Id1ToId2 = null;
private static Dictionary<int, int> Id1ToId3 = null;
//etc.
public static void FillCache(DataSet data)
{
foreach (DataRow r in data.Tables[0].Rows)
{
//fill list and/or dictionaries with id's
}
}
ルックアップの例は次のようになります。
public static int GetId2FromId1(int id1)
{
return AllIdMappings.FirstOrDefault(m => m.Id1 == id1).Id2;
//or
return Id1ToId2[id1];
}
これは、メモリ使用量を削減するという点で必要なことを行いますが、結果としてルックアップのパフォーマンスが低下するため、別のものを実装する方法を検討しています。リストを反復するよりも比較的高速なマルチインデックスキーまたはマルチキールックアップを行う方法はありますか?