Оптимизировать использование памяти очень большого HashMap - PullRequest
0 голосов
/ 16 октября 2019

Мне нужно предварительно обработать данные из OpenStreetMap. Первым шагом является сохранение группы узлов (более 200 миллионов) из файла unprocessed.pbf (Европа, ~ 21 ГБ). Поэтому я использую HashMap. После импорта данных на карту моя программа проверяет каждый узел на соответствие определенным условиям. Если нет, то узел удаляется с карты. После этого каждый оставшийся узел на карте записывается в новый файл processed.pbf.

Проблема в том, что эта программа использует более 100 ГБ ОЗУ. Я хочу оптимизировать использование памяти.

Я прочитал, что должен настроить начальную емкость и коэффициент загрузки HashMap, если используется много записей. Теперь я спрашиваю себя, какое значение является лучшим для этих двух параметров.

Я также видел, что загрузка памяти при использовании JVM Oracle-JDK (1.8) увеличивается медленнее, чем при использовании OpenJDK JVM (1.8),Есть ли какие-то настройки, которые я могу использовать для OpenJDK JVM, чтобы минимизировать использование памяти?

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 18 октября 2019

В хэш-карте будет много collision, если вы не предоставите load factor и initial size при поиске ключа.

Как правило,

default load factor = 0.75, we provide a 
initial size = ((number of data) / loadFactor) + 1

Увеличивает эффективность кода. Поскольку в hashmap больше места для хранения данных, это уменьшает коллизии, возникающие внутри hashmap при поиске ключа.

...