From b67e8cf65890ab37feaa063d98e3b3c03da93947 Mon Sep 17 00:00:00 2001 From: SisMaker <1713699517@qq.com> Date: Tue, 4 Jul 2023 23:22:31 +0800 Subject: [PATCH] =?UTF-8?q?ft:=20ets=E7=9B=B8=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/erlang/etsmatch.hrl.md | 14 +++++++++++++- src/template/utEtsFold.erl | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/docs/erlang/etsmatch.hrl.md b/src/docs/erlang/etsmatch.hrl.md index 1ef15c3..3d46106 100644 --- a/src/docs/erlang/etsmatch.hrl.md +++ b/src/docs/erlang/etsmatch.hrl.md @@ -30,4 +30,16 @@ ets表并发写优化 case Success of true -> New; false -> update_with_fun(Table, Key, Fun) - end. \ No newline at end of file + end. + +match + 用法:获取 ets 存储数据结构的某几个数据集合 +match_object + 用法:获取 ets 存储的符合条件的整个结构,只能支持直接值匹配 + 用法 1:迭代的遍历整个 ets 列表 match_object/3 + 用法 2:查找指定数据的 ets 列表 match_object/2 +select + 用法: 一般用于条件判定来筛选符合条件的数据和指定格式 (>=, =/=,<,=< 等) + 一般和 ets:fun2ms 结合使用 + 效率较前两个较为慢一些,特别是 ets 中 key 的查找,效率就更慢了,能用 match_object 的就不要用 select + diff --git a/src/template/utEtsFold.erl b/src/template/utEtsFold.erl index 5db6a71..d7aaf03 100644 --- a/src/template/utEtsFold.erl +++ b/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}}]}]). + + + +