簡潔而甜美;我正在建立一個新項目,我可以用返回ETS,但我寧願回到Mnesia--由於內置交易等可能派上用場的東西。 I 不需要關心複製和擴展到其他節點,這就是爲什麼我認爲Mnesia的性能在ETS上有開銷。在Elixir/Erlang的(本地)Mnesia實例中實現最佳寫入性能
zackehh:~/GitHub/my_project$ MIX_ENV=test mix bench
Settings:
duration: 1.0 s
## BasicBench
[19:24:15] 1/4: retrieve key hit mnesia
[19:24:23] 2/4: retrieve key hit
[19:24:30] 3/4: insert new key mnesia
[19:24:33] 4/4: insert new key
Finished in 25.24 seconds
## BasicBench
insert new key 10000000 0.63 µs/op
retrieve key hit 10000000 0.64 µs/op
retrieve key hit mnesia 10000000 0.69 µs/op
insert new key mnesia 500000 4.70 µs/op
我跑了幾個(本地)的基準,並且很明顯,Mnesia的是讀PERF相媲美,但寫PERF慢得多。我想知道是否有任何方法來加速它(例如關閉複製檢查等)。
附加信息:
Mnesia的表:
[
{ :ram_copies, [node()] },
{ :local_content, true },
{ :attributes, [:key,:value] }
]
測試
- ETS操作使用
:ets.lookup/2
和:ets.insert/2
- Mnesia的操作使用
:mnesia.dirty_write/1
和:mnesia.dirty_read/2
我一直在用拖網捕小時,沒有任何的文檔已經跳出了作爲一個潛在的方法來加快這 - 所以我可能會盯着一個PERF牆,但如果有人能澄清/確認/建議,這將不勝感激。
我看到了有關的東西:mnesia.ets,你可以提供一個例子嗎?我不太明白它在功能上需要什麼 - Mnesia呼叫? – whitfin
@zackehh Mnesia的一些函數像'mnesia:write/1'一樣是上下文敏感的。所以如果你把它封裝在一個'fun'裏面,並且把這個函數傳遞給'mnesia:ets/1',它將直接在本地ets表上執行,而沒有這樣的開銷。例如:'mnesia:ets(fun() - > mnesia:write({table_name,key_1,val_1})end)'。 –
知道了,試了一下,速度較慢:p感謝這個建議,但我想打開該上下文與使用上下文節省的成本一樣。好吧! – whitfin