Реализация неизменных карт для огромных карт - PullRequest
10 голосов
/ 19 февраля 2010

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

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

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

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

Ответы [ 3 ]

20 голосов
/ 19 февраля 2010

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

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

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

8 голосов
/ 19 февраля 2010

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

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

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

4 голосов
/ 19 февраля 2010

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

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

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

...