Вопрос

Я смотрел на проблему написания параллельного MultiMap, и у меня есть реализация, поддерживаемая Google Guava ConsureSetMultiMap и карта вычислительной карты Mapmaker, которая создает по требованию ценностей-коллекций в виде набора по сравнению с CONCURRENTHASHMAP. С какой-то заботой о коллекциях и различных обертках, я думаю, что это становится довольно близко.

Большая проблема, которая уже была обсуждаемый к другие ВОЗ имеют Пробовал это, кажется, что удаление ценностей-коллекций из основной карты, когда они становятся пустыми, без внедрения условий ран.

Пару вариантов, кажется, существует.

  • Оставьте пустые коллекции там. Это утечт некоторые CHMS, но я считаю, что это должно быть, по крайней мере, правильно.
  • Попробуйте оптимистично, чтобы удалить коллекцию, когда пустое и компенсируйте, если в нем ничего не появится. Это полно гонок и кажется искрому невозможно.
  • Синхронизировать все на значении-коллекции, которая, по крайней мере, позволит этому удалению, но по стоимости любого параллелизма после первоначального поиска по ключу.
  • Для небольшого наказания (возможно, в зависимости от узоров использований?), возможно, синхронизируйте на создание и удаление ценностей, должны проверять, что это охватывает все.

Вопросы:

  • Кто-нибудь знает о любых лучших реализации, чем это? Можем ли мы сделать лучшие сочинения битов MapMaker, или это нужно специализированное concurrenthashmultimap, написанные с нуля?
  • Если это сложно много улучшить на этом, это утечка, вероятно, будет большая часть вопроса на практике? Известные коллекции, такие как java.util.hashmap, Juc.concurrenthashmap и arraydeque Не изменяйте изменение резервного хранилища вниз, а ArrayList не делает это автоматически. Пока мы удивляем объекты, мне интересно, будет ли это иметь значение слишком много.

Спасибо


Редактировать: смотрите также обсуждение здесь в списке рассылки Guava.


Редактировать 2: Я с момента написала это. Пожалуйста, посмотри Этот код Google Code для реализации. Я бы очень признателен за любые отзывы от тех, кто ее пытается, а не здесь.

Это было полезно?

Решение

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

Эта реализация последовала за вашим первым предложением: оставляя пустые коллекции на задней карте. Следующее поведение в реальном времени усложняет ваши другие предложения.

Multimap<String, Integer> multimap = HashMultimap.create();
Set<Integer> set = multimap.get("foo");
multimap.put("foo", 1);
int count = set.size();   // equals 1

Для реального мира применения, в отличие от класса библиотеки сбора, что-то меньшее, чем полностью одновременно MultiMAP. Вы можете определить свой собственный класс, который реализует подмножество интерфейса MultiMap или ограниченный выбор гарантий параллелизма. Или ваша логика приложений может минимизировать утверждение синхронизированного мультимногона, чтобы избежать проблем с производительностью.

Другие советы

Я задавал тот же вопрос ранее, и закончил реализацию 4 различных реализаций.

Вопрос:Высокопроизводительные одновременные MultiMap Java / Scala

Impl (я называю это индекс)http://github.com/jboner/akka/blob/master/akka-actor/src/main/scala/actor/actorregistry.scala#l314.

Если вы действительно не хотите утерять пустую коллекцию, вы можете попытаться аторично заменить его в будущем для каждого ключа. Таким образом, одновременные добавления / удаления или добавления / добавления должны иметь возможность добраться до постоянного состояния при расширении снова.

Использование неизменных коллекций в качестве значений является лучшим способом решения / упрощения основных проблем параллелизма, поскольку вы можете удалить с помощью метода атомной замены. К сожалению, нет неизменных коллекций с быстрыми профилями копирования / обновления в общем использовании, поэтому вам обычно нужно сделать довольно дорогое скопировать все.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top