Как создать индекс для быстрого доступа к хеш-таблице clojure? - PullRequest
3 голосов
/ 30 декабря 2010

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

Думаю, мне также интересно, является ли STM подходящим местом для большого индексированного набора данных.

Ответы [ 2 ]

5 голосов
/ 30 декабря 2010

В зависимости от того, насколько далеко вы хотите продвинуться, вы просите создать базу данных в памяти. Я предполагаю, что вы на самом деле не хотите этого делать или, по-видимому, используете одну из многих уже существующих баз данных Java в памяти ( Derby , H2 и т. Д.).

Если вам нужен индексированный или диапазонный доступ к нескольким атрибутам ваших данных, вам необходимо создать все эти индексы в структурах данных Clojure. Карты Clojure дадут вам O (log32 n) время доступа к данным (хуже, чем постоянные, но все еще очень ограниченные). Если вам нужно лучше, вы можете использовать Java-карты, такие как HashMap или ConcurrentHashMap напрямую с предупреждением о том, что вы находитесь вне модели данных Clojure. Для доступа к диапазону вам понадобится какая-то сортированная древовидная структура данных ... В Java есть ConcurentSkipListMap , что очень хорошо для ее работы. Если этого недостаточно, вам может понадобиться ваш собственный btree impl.

Если вы не меняете эти данные, то STM Clojure не имеет значения. Эти данные обрабатываются как кеш подмножества базы данных? Если это так, вы можете рассмотреть возможность использования библиотеки кеша, например Ehcache (недавно они добавили поддержку очень больших кэшей вне кучи и возможностей поиска).

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

2 голосов
/ 30 декабря 2010

Возможно, вы захотите создать отдельные индексы для каждого поля, используя sorted-map , чтобы вы могли выполнять запросы диапазона. Под этим скрывается нечто вроде постоянной версии Java TreeMap.

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

  • Чтения не требуют любой блокировка
  • Вы можете сделать непротиворечивый снимок данных и индексов одновременно.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...