Java: многопоточные карты: как реализации выдерживают сравнение?

Я ищу хорошую реализацию Map хеша. А именно, один это хорошо для создания большого количества карт, большинства из них маленький. Таким образом, память является проблемой. Это должно быть ориентировано на многопотоковое исполнение (хотя потеря помещенного нечетного могла бы быть компромиссом OK взамен лучшей производительности), и быстро и для получают и помещают. И я также хотел бы луну на палке, с гарниром справедливости.

Опции, которые я знаю:

  • HashMap. Катастрофически неориентированный на многопотоковое исполнение.

  • ConcurrentHashMap. Мой предпочтительный вариант, но это имеет значительный объем потребляемой памяти - о 2k на экземпляр.

  • Collections.sychronizedMap(HashMap). Это работает хорошо на меня, но я уверен, что должны быть более быстрые альтернативы.

  • Находка или Кольт - я думаю, что ни один из них не ориентирован на многопотоковое исполнение, но возможно код мог быть адаптирован, чтобы быть ориентированным на многопотоковое исполнение.

Какие-либо другие? Совет относительно того, что бьется что когда? Какой-либо действительно хороший новый хеш отображает алгоритмы, из которых Java мог использовать реализацию?

Заранее спасибо за Ваш вход!

6
задан Daniel Winterstein 20 May 2010 в 23:22
поделиться

6 ответов

Collections.synchronizedMap () просто синхронизирует все методы Map .

ConcurrentMap - это действительно тот интерфейс, который вам нужен, и существует несколько его реализаций (например, ConcurrentHashMap , ConcurrentSkipList ). В нем есть несколько операций, которых нет в Map , которые важны для потоковобезопасных операций. Кроме того, она более детализирована, чем синхронизированная Карта , поскольку операция блокирует только часть резервной структуры данных, а не всю ее.

6
ответ дан 8 December 2019 в 17:19
поделиться

Очень удивительно, что он имеет 2к стопов!!! Как насчет того, чтобы сделать настройку параллелизма ConcurrentHashMap ниже (например, 2-3), и оптимизировать его начальный размер (= сделать меньше).

Я не знаю, откуда берется этот расход памяти, но, возможно, это как-то связано с поддержкой полосатых блокировок. Если вы уменьшите значение параметра concurrency, он будет потреблять меньше.

Если вам нужна хорошая производительность и безопасность потоков из коробки, ConcurrentHashMap действительно хорош.

2
ответ дан 8 December 2019 в 17:19
поделиться

Ну, в Apache Mahout есть нарядный Кольт. Это все еще не в текущем бизнесе. Что плохого в защите кода синхронизированным блоком? Ожидаете ли вы какой-нибудь дьявольски сложной схемы, которая удерживает блокировки с меньшей степенью детализации, чем put или get ?

Если вы можете написать код, пожалуйста, внесите его в Mahout.

0
ответ дан 8 December 2019 в 17:19
поделиться

Стоит взглянуть на постоянные хеш-карты в Clojure.

Это неизменяемые, потокобезопасные структуры данных с производительностью, сопоставимой с классическими Java HashMaps. Вам, очевидно, нужно обернуть их, если вы хотите изменяемую карту, но это не должно быть трудным.

http://clojure.org/data_structures

0
ответ дан 8 December 2019 в 17:19
поделиться

Google Collection MapMaker кажется как будто он тоже может работать.

3
ответ дан 8 December 2019 в 17:19
поделиться

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

Я заметил, что в API есть FastMap , который утверждает, что является потокобезопасным. Как я уже сказал, понятия не имею, подходит ли это вам, но стоит взглянуть:

API для FastMap

Javolution Home

3
ответ дан 8 December 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: