Достигая предела .NET Dictionary - что именно? - PullRequest
0 голосов
/ 18 марта 2019

В консольном приложении x64 .NET я загружаю большую справочную таблицу в Dictionary<object, object>.В этом конкретном случае и ключ, и значение являются строками, но приложение должно быть независимым.Строки состоят из 12 однобайтовых символов и 15-17 однобайтовых символов каждая (цифры и az).Таблица поиска содержит ~ 55 миллионов записей.

Мне нужно загрузить ее в оперативную память для повышения производительности, база данных не будет отличной.

Проблема в том, что после загрузки около 49 миллионов записей я получаюисключение вне диапазона от Dictionary.В настоящее время процесс имеет размер коммита около 8 Гбайт.Сервер, на котором он работает, имеет 24 Гбайт ОЗУ, и его еще много.Операционная система и приложение являются 64-битными.

Я попытался разбить на секунду Dictionary после 30 миллионов элементов, что работает, так что это не ограничение ОЗУ как таковое.Должно быть ограничение в Dictionary.

Мне интересно, какое это может быть ограничение.Есть идеи?

Ответы [ 2 ]

3 голосов
/ 18 марта 2019

MS docs утверждает, что:

Массивы размером более 2 ГБ не включены. Это значение по умолчанию.

Скорее всего, вы попали в это ограничение. Вы можете изменить это поведение, добавив его в конфигурацию вашего приложения:

<gcAllowVeryLargeObjects enabled="true" />  
1 голос
/ 18 марта 2019

Может быть, вы можете попробовать изменить хеш-код строки. Верхний и нижний регистр кода строки отличаются на 0x20. Быстрый способ игнорировать регистр - это либо ИЛИ каждый символ с 0x20 (для нижнего регистра), либо И каждый символ с ~ 0x20 (для верхнего регистра) до хэширования.

Кроме того, C # не предназначен для обработки миллионов, миллиардов записей. Может быть, попробуйте сохранить его в SqlLite и получить его в пакетном режиме. Sql довольно хорош для работы с миллионами записей.

У меня недавно была проблема, когда нужно было запросить миллионы записей, чтобы найти, существует ли запись. Я закончил тем, что использовал Bloom Filter, чтобы сказать, существует ли запись.

...