Реализация неизменной карты для огромных карт
Если у меня есть неизменяемая Карта, от которой я могу ожидать (в течение очень короткого периода времени - например, нескольких секунд) добавления / удаления сотен тысяч элементов, это стандарт 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 вместо этого.
(*) Неизменяемая Карта Скалы на самом деле не является неизменной. Это изменяемая структура данных внутри, которая требует много синхронизации.