`
zhongwencool
  • 浏览: 27166 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

erlang ets

ets 
阅读更多
参见:http://www.cnblogs.com/me-sa/archive/2011/08/11/erlang0007.html
自己的看法:
1)如果一个表中数据太大,不要用ordered_set表。(这个表的好处在于可以按key来排序,但只能用这个唯一的key,实际工作中要按复杂的排序规则,所以不好用。
2)ets doc里面有大量的函数如next last, first基本是不用的。这些都是用c写的bif
不用于上层。只要用好ets.erl里面的上层导出就行了。---看看实现也适合。
3)......

%%ets的使用
%%ets:new/2 
%% name_table--------标记这个ets表,可以用ets_for_test来操作这个表
%% set ordered_set, bag , duplicate_bag 表结构 前二个key 唯一的 ordered_set有序的(注意这种表的查询是很严格的1与1.0是不同的)
%%{keypos,Num} 以什么为key
%%操作权限public protected private
-record(role_data,{role_id,role_name,tel=13800000}).
new(Tab,Type) ->
    ets:new(Tab, [named_table, Type, public, {keypos, #role_data.role_id}, {write_concurrency, true}, {read_concurrency, true}]).

%%插入
%%这个函数不会按照值的前后顺序排序的(ordered_set表除外)。
insert(Tab) ->
    [begin 
         ets:insert(Tab,#role_data{role_id=RoleID,role_name=RoleName,tel=Tel}) 
     end||RoleID<-lists:seq(1,20),RoleName<-lists:duplicate(20,"test_zhong"),Tel<-lists:seq(13800001,13800020)],
    io:format("insert into table::Tab~w Data~w",[Tab,ets:tab2list(Tab)]).

%%查找bif 
look_up(Tab,Key) ->
    T = ets:lookup(Tab,Key),
    io:format("look_up tab:~w:key:~w:result:~w",[Tab,Key,T]).
%%数据太大了。一次性处理不过来就用分页
%%如果想返回表前50个元素:
%%{M,C}= ets:match(Tab,'$1',50).就可以做到,便是这只是对数据太大了分布处理所有数据,不要想取出排名前50名的元素,因为只有ordered_set可以做到。
%%{M2,C2} = ets:match(Tab,C).
%%...
match(Tab,Spec,Limit) ->%%试下:tab = 你建的,spec='$1',limit=4
    T  = ets:match(Tab,Spec,Limit),
    io:format("match tab:~w:Spec:~w:Limit:~w:result:~w",[Tab,Spec,Limit]).

%%其实最常用的的下面的查找条件函数
%%如果想返回表中满足条件的元素,最好的函数是
%%match_object(Tab, Pattern, Limit) -> {[Match],Continuation} | '$end_of_table'
 
%%match_object(Continuation) -> {[Match],Continuation} | '$end_of_table'
 
%%select(Tab, MatchSpec, Limit) -> {[Match],Continuation} | '$end_of_table'
 
%%select(Continuation) -> {[Match],Continuation} | '$end_of_table'
%%只获取数据数量的:select_count(Tab,MatchSpec) -> NumMatched

%%其中重点在于MatchSpec的写法:最简单的用法:
%%1)match_object(Tab,#r_record{id=45,_='_'}).%%_表示占位符可以任意字段,不可省略
%%2)macth_object(Tabl,{23,_}).%%可以是任务类型
%%3)复杂的只能用ets:fun2ms/2来
%%MS  = ets:fun2ms(fun(Data=#r_record{id=ID})when ID>34 -> Data end),
%%得到一个一MatchSpec
%%match_object(Tab,MS,Limit).%或
%%select(Tab,MS,Limit).

%%同理:match_delete/2,match_delete/3也是如此用法

%%遍历一个表做事
%%其实有ets:first/1返回第一个key ets:next/1,这些bif来实现
%%但是可以用ets:foldl/3来做!他的实现如下
%% foldl(F, Accu, T) ->
%%     ets:safe_fixtable(T, true),
%%     First = ets:first(T),
%%     try
%%         do_foldl(F, Accu, First, T)
%%     after
%% 	ets:safe_fixtable(T, false)
%%     end.

%% do_foldl(F, Accu0, Key, T) ->
%%     case Key of
%% 	'$end_of_table' ->
%% 	    Accu0;
%% 	_ ->
%% 	    do_foldl(F,
%% 		     lists:foldl(F, Accu0, ets:lookup(T, Key)),
%% 		     ets:next(T, Key), T)
%%     end.
          
%%所以要是用遍历时就用ets:fold/3就可以了。那些last next这些太底层了。有封装好的。

%%查看表的详细情况可以用
%%返回所有的ets表(只在终端上显示)
%%ets:all().
%%列出一个ets的表类型,使用内存,所有者信息|(只在终端上显示)
%%ets:i().
%%最详细信息了
%%ets:info(Table).
分享到:
评论

相关推荐

    A Study of Erlang ETS Table

    The viability of implementing an in-memory database, Er- lang ETS, using a relatively-new data structure, called a Judy array, was studied by comparing the performance of ETS tables based on four data...

    ets_ui:Erlang术语存储用户界面

    或者自己创建 ETS 表并在 ui 上玩耍动机在一个地方聚合来自多个 erlang 节点的结果。 基于 HTTP 的 ETS 查询能力。 TODO: 客户端模式/集群模式 * 集群模式在它的子客户端模式机器上运行查询安装 make shellAPI 参考...

    erlang_gproc_扩展实现Erlang的全局ets

    扩展实现Erlang的全局ets, 来自互联网上一个尚未完成的开源项目。 本人开发完善了差不多所有功能。 欢迎下载使用。

    Erlang程序设计(第二版)及源码

    书中兼顾了顺序编程、并发编程和分布式编程,重点介绍如何编写并发和分布式的Erlang程序以及如何在多核CPU上自动加速程序,并深入地讨论了开发Erlang应用中至关重要的文件和网络编程、OTP、ETS和DETS等主题。...

    Erlang6大数据存储方式总结

    个人学习Erlang对于Erlang处理数据的各种方式的总结,讲述编程语言Erlang的ets,dets,mnesia,mysql,dict,和进程字典的用法,希望能帮助读者在这个总结里学到一些东西.

    Learn You Some Erlang for Great Good

    raising errors, and starting/stopping processes over many nodes * Storing and retrieving data using Mnesia and ETS * Network programming with TCP, UDP, and the inet module * The simple joys and ...

    erlpool:基于ETS的Erlang进程的Erlang循环负载均衡器

    基于ETS的Erlang进程的Erlang循环负载均衡器 erlpool做什么 Erlpool是用于Erlang进程的循环负载均衡器,主要用于与数据库连接之类的事情。 与和相比, erlpool非常简单且很小(〜100 LOC),并且没有关于工人的假设...

    碎片:Erlang和Elixir的分区ETS表

    碎片:Erlang和Elixir的分区ETS表

    Erlang参考手册

    CHM格式 非常方便查阅,支持索引,等。快速查找 跟官方完全一样

    erts erlang api

    erlang api Erlang Run-Time System Application The Erlang Runtime System Application ERTS.

    streams:懒惰的评估,Erlang中的流等

    Erlang:函数式编程的力量 Erlang中的函数式编程,包括流,惰性求值和依赖类型。 在和的演示。 EFBA.pdf和CBSF.pdf中的幻灯片。 关于不同方法的注意事项 lazy.erl惰性示例的权威版本,其中引用存储在命名的ETS表中...

    vmstats:用于生成有关 Erlang VM 的信息的微型 Erlang 应用程序

    vmstats 是一个小型的 Erlang 应用程序,它收集 Erlang VM 上的指标并将它们发送到一个可配置的接收器(例如,StatsD)。 特征 vmstats 收集的不同指标包括: error_logger队列长度 加载的模块数 进程数 进程限制 ...

    erlscripten:Erlang至PureScript转译器。 在浏览器中运行Erlang!

    Erlscripten – Erlang到PureScript编译器...) 钢筋项目移植ETS(仅缺少duplicate_bag实现)支持什么? 位串泄漏可变范围基本的erlang流程仿真NIFs什么将不被支持热门代码重装分布式erlang 随时支持我们: ak_2WESwy76

    Introducing Elixir - Getting Started in Functional Programming

    模式匹配和守卫:程序结构的基础通过递归,字符串,列表和更高级的Delixir处理的核心-order函数创建进程,在它们之间发送消息,并将模式匹配应用于传入消息使用Erlang Term Storage(ETS)和Mnesia数据库存储和操作...

    statman:在 Erlang VM 内有效地收集大量指标

    Statman 使用内存中的 ETS 表来实现低开销日志记录并避免单进程瓶颈。 请参阅下面的“它是如何工作的”。 集成选项: :实时(移动友好)网络仪表板。 公开一个小型 Web 应用程序和一个 HTTP API,其中 Munin(包括...

    term_cache:Erlang 的简单通用术语缓存

    term_cache 有 4 种实现: term_cache_ets:键和值存储在 ets 表中(一个有序的 set ets 表加上 set ets 表); term_cache_trees:键和值存储在树中(Erlang 模块 gb_trees,1 棵树表示键,1 棵树表示值); term_...

    erlang-memoiz:Erlang的记忆库

    Erlang的记忆库。 基于ETS的记忆的简单实现。 用法示例 ... ok = application:start(memoiz), ... %% this call will return after 1 second: ok = memoiz:do(timer, sleep, [1000]), ... %% and this call will ...

    beruang:重新启动后检索您的ets

    Erlang/OTP 17 [erts-6.3] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace] Eshell V6.3 (abort with ^G) 1&gt; application:start(beruang). ok 2&gt; Tab = beruang:get_ets...

    erltea:Erlang跟踪实用程序

    Erlang跟踪实用程序 当您要咖啡时,为什么要买TEA? 停止拉扯头发,使用追踪:) 当前,erltea使用eper中的Redbug进行远程跟踪。 入门 编译中 make make multitail ( OPTIONAL ) 将节点添加到节点文件中每个条目都是...

Global site tag (gtag.js) - Google Analytics