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

问题描述 投票:1回答:2

我需要将其他逻辑(如映射,条件,聚合)应用于我从Datomic获得的实体。我很难将它翻译成Datomic查询(我不确定它是否可能在我的情况下),这就是我使用datomic的原始索引访问的原因,因此大多数工作和逻辑都是在Clojure中完成的。

它工作正常,直到我达到~500K条目,整个方法变得非常慢。相关代码:

(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秒来映射实体,我的查询需要的字段越多,所需的就越多。

这是预期的行为吗?有没有办法可以加快速度,或者我错过了什么,这是不好的方法?

clojure scalability datomic
2个回答
2
投票

要完全回答这个问题需要更多信息,请随意ask on the forum or open a support ticket


0
投票

我最终得到了以下优化,以防有人需要它:

(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访问字段

© www.soinside.com 2019 - 2024. All rights reserved.