美文网首页
erlang ets表相关

erlang ets表相关

作者: randyjia | 来源:发表于2016-09-02 16:53 被阅读373次
    • 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选项

    相关文章

      网友评论

          本文标题:erlang ets表相关

          本文链接:https://www.haomeiwen.com/subject/lanfettx.html