erlang ets表相關(guān)

  • erlang ets match spec使用
  • erlang ets 性能數(shù)據(jù)測(cè)試

match spec教程和網(wǎng)上的文章基本看不懂,還是例子比較少。我給了一個(gè)使用match_spec很簡(jiǎn)單易懂的例子。
match spec說(shuō)白了,就是類(lèi)似于sql查詢(xún)語(yǔ)句,找出滿足條件的記錄。

%%% @copyright (C) 2016, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 02. 九月 2016 下午3:07
%%%-------------------------------------------------------------------
-module(test).
-author("mohe").
-include_lib("stdlib/include/ms_transform.hrl").
-record(user, {
  id :: integer(),
  name :: string()
}).
%% API
-compile([export_all/1]).
-define(ETS_NAME, ets_test).

init_ets({N}) ->
  ets:new(?ETS_NAME, [named_table, public, set, {keypos, #user.id}, 
{write_concurrency, true}, {read_concurrency, true}]),
  lists:foreach(fun(X) ->
 ets:insert(?ETS_NAME, #user{id = X, name = random_str()}) end,
 lists:seq(1, N)).

%%獲取id大于N的數(shù)據(jù)
gt_id(N) -> 
T1 = ms_time(), 
Mspec = ets:fun2ms(fun(#user{id = Id} = X) when Id > N -> X end),  
Res = ets:select(?ETS_NAME, Mspec),  
T2 = ms_time(), 
io:format("cost:~p ms", [T2 - T1]), 
 Res.

ms_time() -> 
 {_, S, M} = os:timestamp(),  (S * 1000000 + M) div 1000.

%%生成隨機(jī)字符串
random_str() ->  Str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_",  
%%一次隨機(jī)取多個(gè),再分別取出對(duì)應(yīng)值 
 N = [random:uniform(length(Str))|| _Elem <- lists:seq(1, 16)],  
RandomKey = [lists:nth(X, Str) || X <- N],  RandomKey.

測(cè)試

test:init_ets({10000}).
cost:20 ms...

其它

  • 如果數(shù)據(jù)多了, match spec是很消耗時(shí)間的。如果有1000000條記錄,平均查詢(xún)時(shí)間為4000ms
  • lookup_element()和look_up是常量時(shí)間,測(cè)試為0ms。也就是說(shuō),如果調(diào)用這兩個(gè)查詢(xún)函數(shù),不用考慮性能問(wèn)題
  • ets表的寫(xiě)入性能相當(dāng)高,1000000條數(shù)據(jù)的插入,只用了4976ms,1s可以寫(xiě)入將近2000000條記錄
  • 內(nèi)存占用
    按照測(cè)試的數(shù)據(jù)格式,插入1000000條記錄,占用內(nèi)存體積64M,我覺(jué)得非常省內(nèi)存
  • 結(jié)論
    • match spec 可以進(jìn)行多條件查詢(xún),類(lèi)似于sql。
    • 如果是單值查詢(xún),別用match spec,用lookup_element和look_up
    • 如果用ets表,不要猶豫性能和內(nèi)存占用問(wèn)題。等有了性能問(wèn)題,你早就發(fā)財(cái)了(我目前是做手游的);如果有內(nèi)存問(wèn)題,那么可以研究一下compressed選項(xiàng)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,628評(píng)論 19 139
  • http://geek.csdn.net/news/detail/210469http://www.36dsj.c...
    Albert陳凱閱讀 5,634評(píng)論 1 21
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,740評(píng)論 18 399
  • 今夜月明人盡望,不知秋思落誰(shuí)家?這一年過(guò)得好快,依稀記得去年的中秋節(jié)沒(méi)有回家,那天晚上跟藝設(shè)的師哥們?cè)诓賵?chǎng)賞月?lián)u紅...
    理查德克萊德曼閱讀 436評(píng)論 0 0
  • 之前我說(shuō)過(guò),想讀研,不想考。在我以為保研無(wú)望,打算找工作,雅思都考了,簡(jiǎn)歷也投了,正裝也買(mǎi)了之后,竟然保研了。。自...
    alexischi閱讀 272評(píng)論 0 0

友情鏈接更多精彩內(nèi)容