Skip to content

Instantly share code, notes, and snippets.

@kordano
Created December 6, 2021 17:01
Show Gist options
  • Save kordano/40a1e103b732aea6b4f049ba23d72dca to your computer and use it in GitHub Desktop.
Save kordano/40a1e103b732aea6b4f049ba23d72dca to your computer and use it in GitHub Desktop.
Datahike memory benchmark
(require '[datahike.api :as d])
(import '[java.util Random]))
(taoensso.timbre/set-level! :warn)
;; Thanks to https://stackoverflow.com/a/64034927/10978897
(defn rand-str
^String [^Long len]
(let [leftLimit 97
rightLimit 122
random (Random.)
stringBuilder (StringBuilder. len)
diff (- rightLimit leftLimit)]
(dotimes [_ len]
(let [ch (char (.intValue ^Double (+ leftLimit (* (.nextFloat ^Random random) (+ diff 1)))))]
(.append ^StringBuilder stringBuilder ch)))
(.toString ^StringBuilder stringBuilder)))
(def cfg {:store {:backend :file
:path "/tmp/mem-bench"}
:keep-history? true
:attribute-refs? false
:schema-flexibility :write})
(def schema [{:db/ident :block/text
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one}
{:db/ident :block/counter
:db/valueType :db.type/long
:db/cardinality :db.cardinality/one}
{:db/ident :block/id
:db/valueType :db.type/long
:db/unique :db.unique/identity
:db/cardinality :db.cardinality/one}])
(d/delete-database cfg)
(d/create-database cfg)
(def conn (d/connect cfg))
(d/transact conn {:tx-data schema})
(doseq [n (range 500000)]
(d/transact conn {:tx-data (vec (concat [{:block/text (rand-str (rand-int 10000))
:block/id (mod n 50000)
:block/counter n}]
(when (< 5000 n)
[[:db/retractEntity [:block/id (mod n 5000)]]])))}))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment