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

erlang数据库 ETS 工作原理分析

阅读更多
ETS 是erlang term strorage 的意思 文档见erl5.5.5/lib/stdlib-1.14.5/doc/html/index.html。 这个是beam里面很核心的一个功能。ets, dets, mnesia 组成了erlang的数据库,注意mnesia本身没有存储机制 它的存储就是ets 和dets。

用ets:i().看下可以知道
11              code              set   254    11393    code_server
 12              code_names        set   48     5323     code_server
 13              shell_records     ordered_set 0      72       <0.25.0>
 ac_tab          ac_tab            set   6      853      application_controller
 file_io_servers file_io_servers   set   0      279      file_server_2
 global_locks    global_locks      set   0      279      global_name_server
 global_names    global_names      set   0      279      global_name_server
 global_names_ext global_names_ext  set   0      279      global_name_server
 global_pid_ids  global_pid_ids    bag   0      279      global_name_server
 global_pid_names global_pid_names  bag   0      279      global_name_server
 inet_cache      inet_cache        bag   0      279      inet_db
 inet_db         inet_db           set   21     528      inet_db
 inet_hosts      inet_hosts        set   1      310      inet_db

也就是说erlang的kernel 和stdlib库的实现都很依赖于这个ets.

文档里面一句话: This module is an interface to the Erlang built-in term storage BIFs.  ets.erl本身只是一个封装的模块 用于检查参数等等 实际的工作都是bif作的,所以效率非常好。
看下otp_src_R11B-5\erts\emulator\beam\bif.tab

#
# Bifs in ets module.
#

bif ets:all/0
bif 'erl.lang.ets':all/0        ebif_ets_all_0
bif ets:new/2
bif 'erl.lang.ets':new/2        ebif_ets_new_2
...
bif 'erl.lang.ets':match/1        ebif_ets_match_1
bif ets:match/2
bif 'erl.lang.ets':match/2        ebif_ets_match_2
bif ets:match/3

在emulator里面和ets实现有关的 有erl_db.c(界面) erl_db_hash.c(hash实现) erl_db_tree.c(tree实现) erl_db_util.c(match虚拟机等 ) 总代码有 将近有20,000行实现是很复杂的,据说下一版本会用jarray的算法来做效率更高。

ets的实现不是多线程安全的,数据不参加GC, 使用的时候要注意。

当我们要遍历ets的时候 可以用first/next来遍历  也可以用foldr foldl来看ets看成list来使用。但是这样使用的时候有效率问题 数据要从erts内部搬到process 当ets很大的时候就效率低。

这时候ets:select match MatchSpec来帮你了. ets内部实现了一个虚拟机把matchspec编译成opcode 然后eval的时候把需要的数据才拷贝到process去 大大减少了数据量. 这个方法类似于sqlite。

见db_match_set_compile 编译matchspec成opcode
   db_prog_match        运算opcode 细节可以看下代码。

这还不够 ets 考虑到matchspec比较难写 又提供了一个功能 fun2ms 可以把标准的erlang fun转换成matchspec.请参考ms_transform.

有了这些功能的辅助 ets使用起来就很方便了。

分享到:
评论

相关推荐

    erlang_gproc_扩展实现Erlang的全局ets

    在Erlang中,ETS(Erlang Term Storage)是内置的一种高效、内存中的数据库,用于存储和检索Erlang术语。然而,ETS的一个限制是它不支持全局的、跨进程的数据访问。为了解决这个问题,`gproc`库应运而生。 `gproc`...

    A Study of Erlang ETS Table

    这些基准测试的结果提供了对不同数据结构在Erlang ETS中的表现进行深入分析的基础。 #### 数据结构简介 1. **AVL平衡二叉树**:是一种自平衡的二叉查找树,能够在添加或删除操作后自动保持平衡状态,从而确保查找...

    Erlang高级应用和原理

    【Erlang高级应用和原理】深入探讨 Erlang是一种高级编程语言,以其在并发处理、分布式计算和容错性方面的强大能力而闻名。它在国内和国外都有多个成功的应用案例,例如校内的广告平台、Sohu的白社会、阿里巴巴的...

    Erlang深度分析

    Erlang深度分析所包含的内容非常广泛,涵盖了从Erlang虚拟机的工作原理、性能优化、最佳编程实践,到最新的Erlang版本中新增特性的介绍。Erlang语言因其独特的并发模型、高效的分布式计算能力和灵活的网络编程接口,...

    Erlang-game-server开发实践.pdf

    * 数据库层:使用Erlang的ETS、Mnesia、MySQL、MongoDB等数据库来存储游戏数据。 游戏服务器实现 在实现游戏服务器时,我们需要考虑以下几个方面: * 玩家和NPC的进程模型:使用Erlang的轻量级进程来模拟玩家和...

    erlang高级原理和应用PPT

    7. **标准库与第三方库**:Erlang的标准库介绍,如ETS(Erlang Term Storage)和Mnesia数据库,以及常用的第三方库如 Cowboy(Web服务器)和Rebar3(构建工具)。 8. **实战案例**:可能包含一些实际项目或案例研究...

    erlang 深度分析

    Erlang数据库ETS(External Term Storage)工作原理分析 - **概念**: ETS提供了一种快速访问的键值存储方式。 - **特性**: - **多进程共享**: 多个Erlang进程可以共享一个ETS表。 - **并发访问**: 支持并发读写操作...

    英雄远征erlang服务器源码含数据库

    【标题】:“英雄远征erlang服务器源码含数据库” 【描述】:“Erlang是一种强大的编程语言,以其优秀的高并发性能和热更新能力而闻名。这个资源包含了一个Erlang服务器的源码,特别适合那些希望快速入门Erlang编程...

    scala erlang groovy python 原理 比较 分析

    标题和描述均提到了对五种编程语言——Scala、Erlang、Groovy、Python以及它们各自的原理、比较和分析。这些语言各自拥有独特的特性和应用场景,在编程领域扮演着不同的角色。下面,我们将深入探讨每种语言的关键...

    Erlang6大数据存储方式总结

    ETS是Erlang内置的一种内存数据库,用于存储和检索Erlang术语。它提供了高效且灵活的数据存储,适用于快速读写操作。ETS支持五种不同类型的表:set、ordered_set、bag、duplicate_bag和proplists,每种类型都有其...

    erlang深度分析.pdf

    ### Erlang深度分析知识点 #### 1. Erlang VM分析 Erlang的虚拟机(VM)即Erlang Runtime System(ERTS),是Erlang系统运行的基础。它支持轻量级进程,提供了高效的并发处理能力。在性能方面,ERTS经过优化,能够...

    ets和Dets

    ETS是Erlang内置的一种内存数据库,它允许开发者在进程间快速、方便地共享和存储数据。由于数据存放在内存中,ETS具有极高的读写速度,适合用于处理大量数据的实时应用。ETS提供了多种类型的表,如set、ordered_set...

    <27>erlang record

    通过分析`ets_test.erl`源码,我们可以深入理解Erlang中的Record是如何与ETS结合使用的,以及如何在实践中提高代码效率和可维护性。不过,由于具体源码未给出,这部分只能进行推测,实际的内容还需要查看源码文件...

    Erlang_OTP_设计原理(含目录).pdf

    Erlang OTP设计原理是一份深入探讨Erlang/OTP(Open Telecom Platform)框架中设计模式和组织代码原则的文档。Erlang OTP作为Erlang语言的中间件平台,提供了构建可扩展和容错系统的标准方法。 文档开篇就介绍了...

    远古封神Server(erlang源码)+文档+mongodb数据库

    《远古封神Server:基于Erlang的服务器架构与MongoDB数据库集成解析》 本文将深入探讨"远古封神Server"项目,这是一个采用Erlang编程语言构建的游戏服务器,搭配MongoDB数据库来实现高效的数据存储和处理。Erlang以...

    ets_ui:Erlang术语存储用户界面

    概要该项目允许通过 http 查询 Erlang ETS 表,以便其他语言/机制可以轻松获取数据库结果。例子该项目可以作为依赖项包括在内。 它在每个应用程序 env http_port的指定端口上启动牛仔应用程序,或者让底层操作系统...

    erlang port driver test

    Port Driver 在 Erlang 中的工作原理如下: 1. **创建端口**:Erlang 进程可以通过 `open_port/2` 函数创建一个新的端口,并指定端口的选项,如可执行文件路径、环境变量等。 2. **数据传输**:Erlang 进程通过端口...

    Erlang程序设计(第2版)1

    ETS(Erlang Term Storage)和DETS(Distributed Erlang Term Storage)是Erlang中的两个内置数据库系统,用于存储和检索Erlang术语。ETS是内存中的数据库,适用于高速访问和低延迟需求,而DETS则提供了持久化存储。...

    inside Erlang VM3

    ### Erlang VM (Erlang虚拟机)深入解析 #### Erlang简介 Erlang是一种通用、并发、强容错的编程语言,最初由...通过深入了解Erlang VM的工作原理及其特性,我们可以更好地利用其优势来设计和实现高效可靠的系统。

Global site tag (gtag.js) - Google Analytics