Вопрос

Если у меня есть неизменный Карта, которую я мог бы ожидать (в течение очень короткого периода времени - как несколько секунд), чтобы добавить/удалять сотни тысяч предметов из, стандарт HashMap Плохая идея? Допустим, я хочу перенести 1 ГБ данных через карту за <10 секунд таким образом, чтобы максимальный размер карты в любой когда -либо мгновение составляет всего 256 МБ.

У меня сложилось впечатление, что карта сохраняет какую -то «историю», но я буду всегда получить доступ к таблице последней обновления (то есть я не передаю карту), потому что это переменная частного элемента Actor который обновляется/доступен только изнутри реакции.

В основном я подозреваю, что эта структура данных может быть (частично) в вину По проблемам, которые я вижу в JVM, выходящих из памяти При чтении в больших количествах данных за короткое время.

Будет ли мне лучше с другой реализацией карты, и, если да, то что это?

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

Решение

Оу. Почему вы должны использовать неизменную карту? Бедный сборщик мусора! Имматируемые карты обычно требуют (log n) новых объектов на операцию в дополнение к (log n) времени, или они действительно просто обертывают изменяемые хеш -карты и изменения слоя сверху (что замедляет ситуацию и может увеличить количество созданий объектов).

Необываемость великолепна, но мне это не похоже на время, чтобы использовать его. Если бы я был тобой, я бы придерживался scala.collection.mutable.HashMap. Анкет Если вам нужен одновременный доступ, оберните Java util.concurrent вместо этого.

Вы также можете увеличить размер молодого поколения в JVM: -Xmn1G или больше (при условии, что вы работаете с -Xmx3G) Кроме того, используйте пропускную способность (параллельный) коллектор мусора.

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

Это было бы ужасно. Вы говорите, что всегда хотите получить доступ к последней обновленной таблице, это означает, что вам нужно только эфемерный Структура данных, нет необходимости оплачивать стоимость за настойчивый Структура данных - это похоже на торговое время и память, чтобы получить полностью спорный «точки стиля». Ты нет Создание своей кармы, используя слепоточные структуры, когда их не требуют.

Кроме того, хэштата является особенно сложной структурой для устойчивого. Другими словами, «очень, очень медленное» (в основном это можно использовать, когда читает, что больше всего чинят, - и вы, кажется, говорите о многих писаниях).

Кстати, ConcurrentHashMap Не имеет смысла в этом дизайне, учитывая, что карта доступна от одного актера (это то, что я понимаю из описания).

Так называемая (*) неизменная карта Скалы нарушается за пределы базового использования до Scala 2.7. Не доверяйте мне, просто посмотрите на количество открытых билетов на это. И решение просто «оно будет заменено чем -то другим на Scala 2.8» (что оно и имело).

Так что, если вы хотите неизменную карту для Scala 2.7.x, я бы посоветовал искать ее в чем -то, кроме Scala. Или просто используйте treehashmap вместо этого.

(*) Необываемая карта Скала не на самом деле неизбежно. Это измененная структура данных внутри, которая требует большой синхронизации.

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