Я хочу создать большую HashMap, но производительность put()
недостаточно хороша. Любые идеи?
Другие предложения структуры данных приветствуются, но мне нужна функция поиска Java-карты:
map.get(key)
В моем случае я хочу создать карту с 26 миллионами записей. Используя стандартную Java HashMap, ставка ставке становится невыносимо медленной после 2-3 миллионов вставок.
Кроме того, кто-нибудь знает, может ли помочь использование разных хеш-кодов для ключей?
Мой метод hashcode:
byte[] a = new byte[2];
byte[] b = new byte[3];
...
public int hashCode() {
int hash = 503;
hash = hash * 5381 + (a[0] + a[1]);
hash = hash * 5381 + (b[0] + b[1] + b[2]);
return hash;
}
Я использую ассоциативное свойство добавления, чтобы гарантировать, что равные объекты имеют один и тот же хэш-код. Массивы представляют собой байты со значениями в диапазоне от 0 до 51. Значения используются только один раз в любом массиве. Объекты равны, если массивы a содержат одинаковые значения (в любом порядке), и то же самое относится к массиву b. Таким образом, a = {0,1} b = {45,12,33} и a = {1,0} b = {33,45,12} равны.
EDIT, некоторые примечания:
-
Несколько человек критиковали использование хэш-карты или другой структуры данных для хранения 26 миллионов записей. Я не понимаю, почему это кажется странным. Для меня это выглядит как классическая структура данных и алгоритмы. У меня есть 26 миллионов элементов, и я хочу иметь возможность быстро вставлять их и искать их из структуры данных: дать мне структуру данных и алгоритмы.
-
Установка начальной емкости Java HashMap по умолчанию на 26 миллионов снижает производительность.
-
Некоторые люди предлагают использовать базы данных в некоторых других ситуациях, которые, безусловно, являются умным вариантом. Но я действительно задаю вопрос о структурах данных и алгоритмах, полная база данных будет излишней и намного медленнее, чем хорошее решение для структуры данных (ведь база данных - это просто программное обеспечение, но будет иметь связь и, возможно, дисковые издержки).