Erlang etsテーブル関連

1992 ワード

  • erlang ets match spec使用
  • erlang ets性能データテスト
  • match specチュートリアルとネット上の文章はほとんど読めませんが、やはり例が少ないです.matchを使ってあげましたspecは分かりやすい例です.match specははっきり言って、sqlクエリ文に似ていて、条件を満たす記録を見つけます.
    %%% @copyright (C) 2016, 
    %%% @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 

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

    その他
  • データが多くなるとmatch specは時間がかかります.100000件のレコードがある場合、平均クエリー時間は4000 ms
  • です.
  • lookup_element()とlook_upは定数時間で、テストは0 msです.つまり、この2つのクエリ関数を呼び出す場合、パフォーマンスの問題
  • を考慮する必要はありません.
  • etsテーブルの書き込み性能はかなり高く、1000000本のデータの挿入は4976 msしかなく、1 sで200000本近くの記録を書き込むことができます
  • メモリ占有試験データフォーマットに従い、100000個の記録を挿入し、メモリ体積64 Mを占有する.
  • 結論
  • match specは、sqlに類似した多条件クエリを行うことができる.
  • 単一値クエリの場合はmatch specを使用せずlookup_を使用elementとlook_up
  • etsテーブルを使用する場合は、パフォーマンスとメモリ使用の問題をためらわないでください.性能の問題があったら、あなたはとっくに金持ちになりました(私は今手遊びをしています).メモリに問題がある場合は、compressedオプション
  • を検討してください.