Java: большая постоянная хеш-структура? - PullRequest
7 голосов
/ 30 сентября 2010

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

Мне нужно, чтобы он был достаточно большим - возможно, 500 - 1 млрд. Ключей.Я оцениваю токийский кабинет http://fallabs.com/tokyocabinet/javadoc/, но не уверен, насколько хорошо он будет масштабироваться - кажется, что время вставки увеличивается по мере увеличения хеш-функции.

Есть идеи о том, что может быть уместным?1007 *

Спасибо

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

Edit2: Одна из причин этого постоянства заключается в том, что у меня ограниченная оперативная память, 4 ГБ, поэтому я не могу вписать большой объем впамять.

Ответы [ 5 ]

5 голосов
/ 04 октября 2010

Я думаю, что Megamap - это то, что вы ищете: http://megamap.sourceforge.net/. Вот краткое описание Megamap со своей домашней страницы:

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

2 голосов
/ 02 октября 2010

Вы ознакомились с Berkeley BD Java Edition?Они имеют API, совместимый с коллекциями (см. Также Javadoc для StoredMap ).

2 голосов
/ 30 сентября 2010

Использовать базу данных, а не хеш.Даже для базы данных 500 миллионов строк становятся достаточно большими.Сколько обновлений вы ожидаете в секунду?

0 голосов
/ 30 сентября 2010

Я думаю, Memcached - хороший вариант для вашего случая вместе с подходящей базой данных в бэкэнде.

0 голосов
/ 30 сентября 2010

Так что, если я правильно понимаю, Redis может быть вариантом. Вы можете использовать команды INCR [key] для атомарного увеличения значения, связанного с этим ключом. Если ключ не существует, он устанавливается в ноль, а затем увеличивается (в результате один). Согласно документам , INCR является операцией с постоянным временем. Скорость - основная цель разработки Redis.

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

...