• rlang内置大数据量数据库 ets,dets 初窥

  • 发布日期:2011-10-24 18:45:48   作者:dp studio

etsErlang term storage的缩写, dets则是disk ets.
它们不同的就是ets存在内存里面,而dets则存在磁盘上。

ets存的数据表是暂时性的,拥有它的进程挂了,它也会挂掉.
dets就算程序完成或者挂了,数据表还是持久存在的.如果是异常退出的, 可以进行修复.

ets表看起来像是由erlang实现的,但实际上它是由运行时系统实现的,所以具有更高的性能. 且有一个特性: ets表不会被垃圾回收!

操作
建表

ets:new和dets:open_file

插入
ets:insert(TableId, X), x 是一个元组或者一个元组列表. 定义了一些参数

查找
ets:lookup(TableId, Key) 它会返回一个元组列表.

删除表
ets:delete(TableId)

表类型
四种: 集合(sets), 有序集(sorted sets), 袋(bags),可重复袋(duplicated bags)

集合:
所有记录的键(key)都是唯一的.
比如先后存{a,1},{b,1}可以 得结果{a,1},{b,1},两条记录。
但先后存{a, 1},{a,3}得到的结果会是{a,3}, 一条记录。

有序集:
特殊的集合, 按键值排序

袋:
 记录的键值可以相同, 但数据不同是相同的.
比如先后存{a,1},{a,3}可以得两条记录;
但先后存{a,1}, {a,1}只有一条记录。

可重复袋:
记录的键值可相同, 记录值也可以相同
先后存{a,1}, {a,1}会有两条记录。

ets效率建议
ets表的底层是由哈希表实现的,不过有序集例外,它是由平衡二叉树实现的。 所以不管是插入还是查找,集合的效率要比有序集高.

可重复袋要比袋的效率要高, 因为袋要和原来的记录比较是否有相同的记录已经插入. 如果一份大数据,相同的记录越多,袋的效率就越慢.

一张ets表是由创建它的进程所拥有, 当此进程调用ets:delete或者进程挂了的时候, 表会被删除.

一般情况, 插入一个元组到一张ets表中, 所有代表这个元组的结构都会被从进程的栈和堆中,复制到ets表中; 当查找一条记录时, 结果元组从ets表中复制到进程的栈和堆中。

但是大型二进制(large binaries) 数据却不是这样! 它们被存入自已所拥有的堆区域(off-heap area)中。这个区域可以被多个进程,ets表,和独立二进制数据所共享。它由引用计数的垃圾回收策略管理, 这个策略会跟踪到底有多少个进程/ets表/二进制数据引用了这个大型二进制数据. 如果引用数为0的话, 此大型二进制数据就会被垃圾回收掉.

看起来很和复杂, 实际结论就是: 两进程间发消息用大型二进制数据消耗很低, 往ets表插入元组用二进制数据也很划算。我们应该尽可能采用二进制数据来实现字符串或无类型的大数据块.

erl0003-ets 几种类型的区别和ets效率建议 <转>的更多相关文章

  1. apache软件no_ssl和openssl两种类型的区别

    apache软件同一版本有两种类型:no_ssl和openssl: openssl多了个ssl安全认证模式,它的协议是HTTPS而不是HTTP,这就是带有SSL的服务器与一般网页服务器的区别了. 一般 ...

  2. SCSI contrller的几种类型的区别

    在VMware vSphere Web Client中, 可以为虚拟机添加一个新的SCSI controller, 选项中包含如下的类型, 那么他们有什么区别呢? 如何选择呢?   BusLogic ...

  3. ResultSet几种类型的区别

    TYPE_FORWARD_ONLY: 默认方式,结果集不能滚动,游标只能向前移动,从第一行移动到最后一行.结果集中的内容与底层数据库生成的结果有关,即生成的结果与查询有关. TYPE_SCROLL_I ...

  4. .NET环境下导出Excel表格的两种方式和导入两种类型的Excel表格

    一.导出Excel表格的两种方式,其中两种方式指的是导出XML数据类型的Excel(即保存的时候可以只需要修改扩展名为.xls)和真正的Excel这两种. using System; using Sy ...

  5. [转]Mysql几种索引类型的区别及适用情况

    此为转载文章,仅做记录使用,方便日后查看,原文链接:https://www.cnblogs.com/yuan-shuai/p/3225417.html Mysql几种索引类型的区别及适用情况   如大 ...

  6. static_cast, dynamic_cast, const_cast 三种类型转化的区别

    强制转化四种类型可能很多人都常常忽略就象我一样,但是有时还是比较有用的.不了解的建议看看,一些机制我也不是十分了解,只是将一些用法写出来让大家看看.                           ...

  7. jsp中两种include的区别【转】

    引用文章:http://www.ibm.com/developerworks/cn/java/j-jsp04293/ http://www.cnblogs.com/lazycoding/archive ...

  8. .net中三种数据类型转换区别((int),Int32.Parse() 和 Convert.toInt32() )

    (typename)valuename,是通用方法: Convert类提供了灵活的类型转换封装: Parse方法,适用于向数字类型的转换. 例如,(int),Int32.Parse() 和 Conve ...

  9. Oracle中Blob和Clob类型的区别与操作

    Oracle中Blob和Clob类型 1.Oracle中Blob和Clob类型的区别 BLOB和CLOB都是大字段类型,BLOB是按二进制来存储的,而CLOB是可以直接存储文字的.其实两个是可以互换的 ...

随机推荐

  1. 【转】欧拉回路&特殊图下的哈密顿回路题集

    转自:http://blog.csdn.net/shahdza/article/details/7779385 欧拉回路[HDU]1878 欧拉回路 判断3018 Ant Trip 一笔画问题1116 ...

  2. 【POJ】【2151】Check the difficulty of problems

    概率DP kuangbin总结中的第8题 一开始题目看错导致想转移方程想错了……想成f[i][j]表示前 i 个队伍中最多的做出来 j 道题的概率……sigh 看了下题解……其实是对于每个队伍 i 单 ...

  3. isEmpty()与equals()、==“”区别

    isEmpty方法源码:public static boolean isEmpty(String str) { return (str == null) || (str.length() == 0); ...

  4. 项目中的Libevent(多线程)

    多线程版Libevent //保存线程的结构体 struct LibeventThread { LibEvtServer* that; //用作传参 std::shared_ptr<std::t ...

  5. 如何解决VS启动越来越慢

    VS2013 用久后,现在启动和打开项目变得很慢 解决方案: A.清理缓存 VS2010清理缓存:启用vs2010命令行工具:在vs2010命令提示符下,执行devenv.exe /resetuser ...

  6. codeforces 397B

    #include <cstdio> #include <cstdlib> #include <cmath> #include <map> #includ ...

  7. [LeetCode]Link List Cycle

    Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using ex ...

  8. 拼写sql语句随笔

    DECLARE @str NVARCHAR(1000)='SELECT * FROM dbo.V_MicroUserInfo ',@where VARCHAR(1000)=' where 1=1' D ...

  9. Opc

    http://www.tuicool.com/articles/nymUz2 http://blog.chinaunix.net/uid-20692368-id-3434001.html http:/ ...

  10. POJ 1062 昂贵的聘礼(Dijkstra)

    题意 : 真真是做POJ第一次遇到中文题,好吧,虽然语言通了,我一开始也没看懂样例什么意思,题意的话就是说这个探险家想娶酋长的女儿,但是没有钱,酋长说他可以用祭司的水晶球或者皮袄来换取少花一部分钱,同 ...