Реализация неизменной карты для огромных карт

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

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

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

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

3 ответа

Решение

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам