SisMaker пре 1 година
родитељ
комит
b67e8cf658
2 измењених фајлова са 45 додато и 2 уклоњено
  1. +13
    -1
      src/docs/erlang/etsmatch.hrl.md
  2. +32
    -1
      src/template/utEtsFold.erl

+ 13
- 1
src/docs/erlang/etsmatch.hrl.md Прегледај датотеку

@ -30,4 +30,16 @@ ets表并发写优化
case Success of
true -> New;
false -> update_with_fun(Table, Key, Fun)
end.
end.
match
用法:获取 ets 存储数据结构的某几个数据集合
match_object
用法:获取 ets 存储的符合条件的整个结构,只能支持直接值匹配
用法 1:迭代的遍历整个 ets 列表 match_object/3
用法 2:查找指定数据的 ets 列表 match_object/2
select
用法: 一般用于条件判定来筛选符合条件的数据和指定格式 (>=, =/=,<,=< )
一般和 ets:fun2ms 结合使用
效率较前两个较为慢一些,特别是 ets 中 key 的查找,效率就更慢了,能用 match_object 的就不要用 select

+ 32
- 1
src/template/utEtsFold.erl Прегледај датотеку

@ -1,7 +1,9 @@
-module(utEtsFold).
-include_lib("stdlib/include/ms_transform.hrl").
%% ordered_set和由单个 ETS (select/2)(Next ) safe_fixtable/ 2
-compile([export_all]).
-export([rank/5, fold/2]).
rank(TabId, PageInfo, Page, Limit, TotalCnt) ->
@ -89,3 +91,32 @@ continueNext(NextKey) ->
matchDoFun(_ValueList) ->
%% do something
ok.
new() ->
ets:new(test_replace, [named_table, public]),
[ets:insert(test_replace, {One, #{ One => One}}) || One <- lists:seq(1, 100000)],
ok.
new_bag(Count) ->
ets:new(test_bag, [named_table, public, bag]),
[ets:insert(test_bag, {1, One}) || One <- lists:seq(1, Count)],
ok.
replace(Key) ->
[{Key, Map}] = ets:lookup(test_replace, Key),
NewMap = Map#{aaa => aaa},
Ms = ets:fun2ms(fun({Key1, OldMap}) when Key =/= Key1 -> {Key1, 1} end),
ets:select_replace(test_replace, Ms).
replace2(Key) ->
[{Key, Map} = Old] = ets:lookup(test_replace, Key),
NewMap = Map#{bbbb => bbb},
ets:select_replace(test_replace, [{Old, [], [{const, {Key, NewMap}}]}]).
replace3(Key) ->
[{Key, Map} = Old] = ets:lookup(test_replace, Key),
NewMap = Map#{bbbb => bbb},
ets:select_replace(test_replace, [{Old, [], [{const, {Key, NewMap}}]}]).

Loading…
Откажи
Сачувај