Clojure Datomic实体api在大量实体上运行缓慢?
我需要将额外的逻辑(如映射、条件、聚合)应用于从Datomic获得的实体。我很难将其转换为Datomic查询(我不确定在我的情况下是否可能),这就是为什么我使用Datomic的原始索引访问,所以大部分工作和逻辑都是在Clojure中完成的 它工作得很好,直到我进入了约500公里,整个过程变得非常缓慢。 有关守则:Clojure Datomic实体api在大量实体上运行缓慢?,clojure,scalability,datomic,Clojure,Scalability,Datomic,我需要将额外的逻辑(如映射、条件、聚合)应用于从Datomic获得的实体。我很难将其转换为Datomic查询(我不确定在我的情况下是否可能),这就是为什么我使用Datomic的原始索引访问,所以大部分工作和逻辑都是在Clojure中完成的 它工作得很好,直到我进入了约500公里,整个过程变得非常缓慢。 有关守则: (defn e->entry "Map e into entry" [e] {:id (:entry/uuid e) ;; each flat field
(defn e->entry
"Map e into entry"
[e]
{:id (:entry/uuid e)
;; each flat field increases mapping time (seems linearly)
:date (:entry/date e)
:summ (:entry/summ e)
;; although when using nested fields, mapping time rises significantly
:groups (map #(-> % :dimension/group :group/name)
(:entry/dimensions e))})
;; query code:
(->> (d/datoms db :aevt :entry/uuid)
(map #(->> %
:e
(d/entity db)
e->entry))))
;; TODO: other actions on mapped entries ...
仅为映射实体而运行查询代码大约需要30秒,查询中需要的字段越多,所需时间就越长
这是预期的行为吗?有什么方法可以加快速度,或者我遗漏了什么,这是一种糟糕的方法吗?要完全回答这个问题,需要更多信息,请随时提供。我最后进行了以下优化,以防有人需要:
(defn eid->entry
"Mapping via :eavt index"
[db eid]
(->> (d/datoms db :eavt eid) ; access all datoms by eid once
(seq)
(reduce (fn [m dtm]
(let [attr-key (d/ident db (:a dtm))
v (:v dtm)]
(assoc m attr-key v))))))
;; new query code
(->> (d/datoms db :aevt :entry/uuid)
(pmap #(->> %
:e
(eid->entry db))))
我使用pmap而不是map,并求助于:eavt
索引来获取实体的所有属性和值,而不是直接使用d/entity