如何在clojure哈希表上创建快速访问索引?

时间:2010-12-30 11:23:51

标签: clojure

我希望在clojure哈希表中存储许多记录。如果我希望使用某个字段或范围查询快速访问某些记录,那么我有什么选项,而不必求助于将数据存储在数据库中(数据首先来自数据库)。

我想我也想知道STM是否也是大型索引数据集的正确位置。

2 个答案:

答案 0 :(得分:5)

根据您想要推送的程度,您需要构建一个内存数据库。我假设您实际上并不想这样做,或者可能使用已存在的许多内存中Java数据库之一(DerbyH2等)。

如果要对数据的多个属性进行索引或范围访问,则需要在Clojure数据结构中创建所有这些索引。 Clojure映射将为您提供O(log32 n)时间访问数据(比常数更差,但仍然非常有限)。如果您需要更好,可以直接使用HashMapConcurrentHashMap等Java地图,以及您在Clojure数据模型之外的警告。对于范围访问,您将需要某种排序的树数据结构...... Java具有ConcurentSkipListMap,这对它的功能非常有用。如果这还不够好,您可能需要自己的btree impl。

如果你没有改变这些数据,那么Clojure的STM就不重要了。此数据是否被视为数据库子集的缓存?如果是这样,您可以考虑使用像Ehcache这样的缓存库(他们最近添加了对非常大的堆外缓存和搜索功能的支持)。

在内存缓存和持久存储之间平衡数据是一件棘手的事情,也是在数据量很大的应用中最重要的事情之一。

答案 1 :(得分:2)

您可能希望使用sorted-map为每个字段创建单独的索引,以便您可以执行范围查询。在引擎盖下,它使用类似Java TreeMap的持久版本。

如果您对读取权限最感兴趣,则STM不应成为问题。事实上,它甚至比可变表更好:

  • 读取不需要任何锁定
  • 您可以同时制作数据和索引的一致快照。