Однократная запись + чтение в Java - PullRequest
5 голосов
/ 12 марта 2009

У меня есть требование, чтобы Карта создавалась с 50 ~ 200 записями (это может быть больше, давайте все равно назовем это не слишком мало). Запись выполняется только один раз, и чтение (с помощью Map.get ("keyName")) может идти более 20 за запрос (это веб-приложение).

Сейчас я собираюсь использовать Hashmap, поскольку он (я полагаю) дает мне наиболее оптимальную производительность (примечание: многочисленные операции чтения по запросу). Не будучи специалистом по структуре данных, кто-нибудь из вас может предложить реализацию Map, которая лучше всего подходит для моих требований, скажем, из пакетов java.lang. *, Apache commons и т. Д.?

Ус

Ответы [ 6 ]

7 голосов
/ 12 марта 2009

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

И прежде чем попытаться заменить Карту, я посмотрю, почему именно мне нужно выполнить 4000 поисков (200 записей по 20 операций чтения каждый) для создания веб-страницы.

Но при ставке я бы предположил, что время выполнения этих 4000 поисков окажется незначительным по сравнению с другими частями процесса.

2 голосов
/ 12 марта 2009

Если все записи выполняются до какого-либо чтения, вы можете использовать метод Collectons.unmodifiableMap .

Если это не так, то написание кода для выполнения того, что вы хотите, не очень сложен (бродит, чтобы найти пост, в котором есть основной код ...)

Хм ... просто чтобы быть уверенным, что вопрос в том, о чем я думаю ... является ли аспект, доступный только для чтения, важной частью или он пытается быстро получить доступ к данным самой важной частью?

Редактировать: (на основании комментария)

Вы проверяли, с помощью профилировщика, медленный ли код? Если нет, то вам пока не стоит об этом беспокоиться.

1 голос
/ 27 марта 2009

Если это действительно стоит того, попробуйте идеальное хеширование . Я не знаком ни с одной реализацией Java.

1 голос
/ 12 марта 2009

Если бы это было на самом деле узким местом, я бы посмотрел на изменение размера карты, чтобы избежать столкновений.

0 голосов
/ 27 марта 2009

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

Поскольку Java поддерживает интерфейсы, реализация чего-либо подобного может быть намного проще (и фактически поощряется), но я не знаком с готовой реализацией.

0 голосов
/ 27 марта 2009

Если вы строго пишете в начале, до того, как читатели начнут работать, то синхронизация и обмен между потоками не являются проблемой ... HashMap - ваш друг. Если вы не уверены в этом: ConcurrentHashMap.

Обе реализации являются частью JDK.

...