Clojure Datomic实体api在大量实体上运行缓慢?

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

我需要将额外的逻辑(如映射、条件、聚合)应用于从Datomic获得的实体。我很难将其转换为Datomic查询(我不确定在我的情况下是否可能),这就是为什么我使用Datomic的原始索引访问,所以大部分工作和逻辑都是在Clojure中完成的

它工作得很好,直到我进入了约500公里,整个过程变得非常缓慢。 有关守则:

(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