erlang ets表相关

  • erlang ets match spec使用
  • erlang ets 性能数据测试

match spec教程和网上的文章基本看不懂,还是例子比较少。我给了一个使用match_spec很简单易懂的例子。
match spec说白了,就是类似于sql查询语句,找出满足条件的记录。

%%% @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的数据
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.

%%生成随机字符串
random_str() ->  Str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_",  
%%一次随机取多个,再分别取出对应值 
 N = [random:uniform(length(Str))|| _Elem <- lists:seq(1, 16)],  
RandomKey = [lists:nth(X, Str) || X <- N],  RandomKey.

测试

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

其它

  • 如果数据多了, match spec是很消耗时间的。如果有1000000条记录,平均查询时间为4000ms
  • lookup_element()和look_up是常量时间,测试为0ms。也就是说,如果调用这两个查询函数,不用考虑性能问题
  • ets表的写入性能相当高,1000000条数据的插入,只用了4976ms,1s可以写入将近2000000条记录
  • 内存占用
    按照测试的数据格式,插入1000000条记录,占用内存体积64M,我觉得非常省内存
  • 结论
    • match spec 可以进行多条件查询,类似于sql。
    • 如果是单值查询,别用match spec,用lookup_element和look_up
    • 如果用ets表,不要犹豫性能和内存占用问题。等有了性能问题,你早就发财了(我目前是做手游的);如果有内存问题,那么可以研究一下compressed选项
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,073评论 19 139
  • http://geek.csdn.net/news/detail/210469http://www.36dsj.c...
    Albert陈凯阅读 10,808评论 1 21
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,064评论 18 399
  • 今夜月明人尽望,不知秋思落谁家?这一年过得好快,依稀记得去年的中秋节没有回家,那天晚上跟艺设的师哥们在操场赏月摇红...
    理查德克莱德曼阅读 2,865评论 0 0
  • 之前我说过,想读研,不想考。在我以为保研无望,打算找工作,雅思都考了,简历也投了,正装也买了之后,竟然保研了。。自...
    alexischi阅读 1,733评论 0 0

友情链接更多精彩内容