Java: многопоточные карты: как сравниваются реализации? - PullRequest
6 голосов
/ 21 мая 2010

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

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

  • HashMap. Безвредно безвредный.

  • ConcurrentHashMap. Мой первый выбор, но у него огромный объем памяти - около 2 тыс. На экземпляр.

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

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

Есть еще кто-нибудь? Любой совет о том, что бьет, что когда? Любые действительно хорошие новые алгоритмы хэш-карты, которые Java могла бы использовать в реализации?

Заранее спасибо за ваш вклад!

Ответы [ 6 ]

6 голосов
/ 21 мая 2010

Collections.synchronizedMap() просто делает все Map методы synchronized.

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

3 голосов
/ 21 мая 2010

Google Collection MapMaker похоже, что он тоже может делать эту работу.

3 голосов
/ 21 мая 2010

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

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

API для FastMap

Javolution Home

2 голосов
/ 21 мая 2010

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

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

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

0 голосов
/ 21 мая 2010

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

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

http://clojure.org/data_structures

0 голосов
/ 21 мая 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...