Теоретически вы получаете 2 ГБ для процесса, но реальность такова, что это 2 ГБ непрерывной памяти, поэтому, если память вашего процесса фрагментирована, вы получите меньше, чем это.
Кроме того, я подозреваю, что хеш-таблица, как и большинство структур данных по умолчанию, удваивается в размерах, когда ее нужно увеличить, что приводит к огромному росту при добавлении элемента переломного момента.
Если вы знаете размер, который необходимо опередить (или имеете разумную завышенную оценку), это может помочь указать емкость в конструкторе.
В качестве альтернативы, если не важно, чтобы оно находилось в памяти, какое-то решение для базы данных может быть лучше и даст вам больше гибкости, если оно достигнет точки, когда оно не помещается в памяти.