Я получаю по этой командеОшибка при Словарь счетчик больше, как 89478457
Dictionary<UInt64, int> myIntDict = new Dictionary<UInt64, int>(89478458);
эту ошибку:
System.OutOfMemoryException was unhandled HResult=-2147024882
Message=Array dimensions exceeded supported range.
Source=mscorlib
StackTrace:
at System.Collections.Generic.Dictionary`2.Initialize(Int32 capacity)
at System.Collections.Generic.Dictionary`2..ctor(Int32 capacity, IEqualityComparer`1 comparer)
На 89478457 нет никакой ошибки. Вот источник Initialize в Dictionary.cs:
private void Initialize(int capacity)
{
int size = HashHelpers.GetPrime(capacity);
...
entries = new Entry[size];
...
}
Когда я воспроизвожу это, ошибка происходит на создании массива. Запись - это структура в этом случае с размером 24. Когда мы получаем max int32 (0x80000000-1) и делим на 24 = 89478485, и это число находится между простыми числами 89478457 и 89478503.
Означает ли это, что массив структуры не может быть больше как maxInt32/sizeOfThisStruct?
EDIT:
Да. Я действительно перехожу на 2 ГБ. Это происходит, когда словарь создает внутренний массив struct Entry, где хранятся пары (ключ, значение). В моем случае sizeof (Entry) - 24 байта, а тип значения - встроенный.
И решение должно использовать флаг gcAllowVeryLargeObjects (спасибо Evk). Фактически в ядре .net флаг равен the environment variable COMPlus_gcAllowVeryLargeObjects (спасибо svick).
И да, Paparazzi является правильным. Я должен думать о том, как не потерять память. Спасибо всем.
Интересно, почему вам нужен словарь, что большие по размеру?Настоящая практичность этого испытания - это то, что я допрашиваю –
@BenPhilipp Int - только для теста. На самом деле это структура. – Mottor
@MukeshAdhvaryu Что вы будете использовать для разреженного 3D-массива. – Mottor