На самом деле 13000000 предметов довольно много.Если 13000000 распределенных классов - это очень глубокий удар в желудок сборщика мусора!
Также, если вы найдете способ использовать словарь .NET по умолчанию, производительность будет очень плохой, слишком много ключей, количество ключейприближается к числу значений, которые может использовать 31-битный хеш, производительность будет ужасной в любой используемой вами системе, и, конечно, памяти будет слишком много!
Если вам нужна структура данных, которая может использовать больше памяти, чемхеш-таблица, вам, вероятно, понадобится настраиваемая хеш-таблица, смешанная с настраиваемой структурой данных двоичного дерева.Да, можно написать собственную комбинацию из двух.
Вы не можете полагаться на .net hashtable наверняка для этой столь странной и конкретной проблемы.
Учтите, что дерево имеет сложность поискаO (log n), в то время как сложность построения O (n * log n), конечно, строить его будет слишком долго.Затем вы должны создать хеш-таблицу из двоичных деревьев (или наоборот), которая позволит вам использовать обе структуры данных, занимающие меньше памяти.
Затем подумайте о компиляции в 32-битном режиме, а не в 64-битном режиме: 64битовый режим использует больше памяти для указателей.В то же время, наоборот, 32-битное адресное пространство может оказаться недостаточным для вашей проблемы.Мне никогда не приходилось сталкиваться с проблемой, которая могла бы исчерпать 32-битное адресное пространство!
Если и ключи, и значения являются простыми типами значений, я бы предложил вам записать структуру данных в C dll и использовать ее черезC #.
Можно попытаться написать словарь словарей.Допустим, вы можете разбить ваши данные на куски по 500000 элементов, например, между 26 словарями, но занятая память будет очень большой, не думайте, что ваша система справится с этим.
public class MySuperDictionary
{
private readonly Dictionary<KEY, VALUE>[] dictionaries;
public MySuperDictionary()
{
this.dictionaries = new Dictionary<KEY, VALUE>[373]; // must be a prime number.
for (int i = 0; i < dictionaries.Length; ++i)
dictionaries[i] = new Dicionary<KEY, VALUE>(13000000 / dictionaries.Length);
}
public void Add(KEY key, VALUE value)
{
int bucket = (GetSecondaryHashCode(key) & 0x7FFFFFFF) % dictionaries.Length;
dictionaries[bucket].Add(key, value);
}
public bool Remove(KEY key)
{
int bucket = (GetSecondaryHashCode(key) & 0x7FFFFFFF) % dictionaries.Length;
return dictionaries[bucket].Remove(key);
}
public bool TryGetValue(KEY key, out VALUE result)
{
int bucket = (GetSecondaryHashCode(key) & 0x7FFFFFFF) % dictionaries.Length;
return dictionaries[bucket].TryGetValue(key, out result);
}
public static int GetSecondaryHashCode(KEY key)
{
here you should return an hash code for key possibly using a different hashing algorithm than the algorithm you use in inner dictionaries
}
}