Erlang---用ETS和DETS存储数据

我的列表mylists中的reverse方法要在ETS表中使用,
-module(mylists).
-export([reverse/1]).
-export([concate/1]).
-export([flatten/1]).

reverse([],Ret) -> Ret;
reverse([H|T],Ret) ->
Temp = [H|Ret],
reverse(T,Temp).

reverse(L) -> reverse(L,[]).

concate([],L) -> L;
concate([H|T],L) ->
Temp=[H|L],
concate(T,Temp).

concate([]) -> [];
concate([H|T]) ->
concate(reverse(H),concate(T)).
flatten(L) -> Temp = concate(L),
case Temp == L of
true -> Temp;
false -> flatten(Temp)
end.
创建一个ETS表,三个字母组合迭代函数,创建一些表,计算创建表所需的时间和访问表所需的时间,获胜者是…
-module(lib_trigrams).
-export([for_each_trigram_in_the_english_language/2,timer_tests/0,time_lookup_ets_set/2,lookup_all_ets/2,time_lookup_module_sets/0,lookup_all_set/2]).
-import(mylists,[reverse/1]).
-export([scan_word_list/3,get_next_word/2,scan_trigrams/3,make_ets_ordered_set/0,make_a_set/2,make_ets_set/0,make_mod_set/0]).
for_each_trigram_in_the_english_language(F,A0)->
{ok,Bin0}=file:read_file(“354984si.ngl.gz”),
Bin=zlib:gunzip(Bin0),
scan_word_list(binary_to_list(Bin),F,A0).
scan_word_list([],,A)->
A;
scan_word_list(L,F,A)->
{Word,L1}=get_next_word(L,[]),
A1=scan_trigrams([KaTeX parse error: Undefined control sequence: \s at position 1: \̲s̲|Word],F,A), s…\r,KaTeX parse error: Undefined control sequence: \n at position 1: \̲n̲|T],L)->{revers…\s|L]),T};
get_next_word([H|T],L)->get_next_word(t,[H|L]).
scan_trigrams([X,Y,Z],F,A)->F([X,Y,Z],A);
scan_trigrams([X,Y,Z|T],F,A)->
A1=F([X,Y,Z],F,A),
scan_trigrams([Y,Z|T],F,A1);
scan_trigrams(
,_,A)->A.
make_ets_ordered_set()->make_a_set(ordered_set,“trigramOS.tab”).
make_ets_set()->make_a_set(set,“trigrams.tab”).

make_a_set(Type,FileName)->
Tab = ets:new(table,[Type]),
F=fun(Str,)->ets:insert(Tab,{list_to_binary(Str)}) end,
for_each_trigram_in_the_english_language(F,0),
ets:tab2file(Tab,FileName),
Size=ets:info(Tab,size),
ets:delete(Tab),
Size.
make_mod_set()->
D=sets:new(),
F=fun(Str,Set)->sets:add_element(list_to_binary(Str),Set) end,
D1=for_each_trigram_in_the_english_language(F,D),
file:write_file(“trigrams.set”,[term_to_binary(D1)]).
timer_tests()->
time_lookup_ets_set(“Ets Ordered Set”,“trigramsOS.tab”),
time_lookup_ets_set(“Ets set”,“trigramsS.tab”),
time_lookup_module_sets().
time_lookup_ets_set(Type,File)->
{ok,Tab}=ets:file2tab(File),
L=ets:tab2list(Tab),
Size=length(L),
{M,
}=timer:tc(?MODULE,lookup_all_ets,[Tab,L]),
io:format("~s lookup=p micro seconds~n",[Type,M/Size]),
ets:delete(Tab).
lookup_all_ets(Tab,L)->
lists:foreach(fun({K})->ets:lookup(Tab,K) end,L).

time_lookup_module_sets()->
{ok,Bin} = file:read_file(“trigram.set”),
Set=binary_to_term(Bin),
Keys=sets:to_list(Set),
Size=length(Keys),
{M,_}=timer:tc(?MODULE,lookup_all_set,[Set,Keys]),
io:format(“Module set lookup=~p seconds ~n”,[M/Size]).
lookup_all_set(Set,L)->
lists:foreach(fun(Key)->sets:is_element(Key,Set) end,L).
在这里插入图片描述
Erlang程序设计-----【瑞典】Joe Armstrong著 牛化成译—【M】北京:中国工信出版社和人民邮电出版社

猜你喜欢

转载自blog.csdn.net/m0_38127487/article/details/113743063
ets