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([$s|Word],F,A), scan_word_list(L1,F,A1). get_next_word([$ ,$ |T],L)->{ reverse([$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】北京:中国工信出版社和人民邮电出版社
上一篇:
JS实现多线程数据分片下载
下一篇:
【OpenHarmony之旅】序章