文档章节

Erlang Map源码初探

rongtou
 rongtou
发布于 2017/03/23 22:59
字数 352
阅读 10
收藏 0

new()

内存分布

put()

当map的size为0时,

if (n == 0) {
        hp    = HAlloc(p, MAP_HEADER_FLATMAP_SZ + 1 + 2);
        tup   = make_tuple(hp);
        *hp++ = make_arityval(1);
        *hp++ = key;
        res   = make_flatmap(hp);
        *hp++ = MAP_HEADER_FLATMAP;
        *hp++ = 1;
        *hp++ = tup;
        *hp++ = value;

        return res;
    }

内存分布

在堆上重新分配一组内存,key存于tuples内,value在flatmap_t结构后面接上,可以看出key跟value都是一段连续内存存储。

size < 32

  1. 先尝试分配一个原来大小一致的内存(不包含tuple-key数组),mp->keys指向原来的tuple-key数组 (重用),遍历keys,复制原来的values数组,如果跟insert的key一致的,就赋值在新的value。
  2. 步骤1中没找到对应的key,则为新增key-value。步骤1分配的内存用来作为新的tuple-key数组,再申请(3+n+1)大小的内存,复制原来的keys,values过来,再在尾部添加新的key-value

小数据量的实现就是双数组,通过查keys数组中k的索引,从values数组中直接读取对应的值,查找的算法复杂度为O(n) 。keys分配的内存并一定需要跟values的在一块连续内存上,因为更新values时可以共用已有的keys。

当map数据量大于32时,采用HAMT来存储

数据量小于32时,增删都是复制原有数据来修改的。大于32时,则利用HAMT的来实现持久化数据的共享。

© 著作权归作者所有

rongtou

rongtou

粉丝 5
博文 9
码字总数 4533
作品 0
广州
程序员
私信 提问
Erlang 调度器初探

Erlang 调度器初探 庄周梦蝶2017-01-0642 阅读 erlang 最近读了 《Characterizing the Scalability of Erlang VM on Many-core Processors》 , 刚好轮到我做技术分享,就做了个 PPT 总结了下...

庄周梦蝶
2017/01/06
0
0
[Erlang 0079] RabbitMQ 初探

最近在项目中实践RabbitMQ,比较幸运现在除了官方网站,还有一本非常棒的书可以读:RabbitMQ in Action;这本书目前还没有中文版或者影印版,但是从网上很容易找到PDF版本和epub mobi的版本.Rabb...

唐玄奘
2017/12/04
0
0
rabbitMQ 初探-环境搭建、erlang客户端例子教程

rabbitMQ 初探-环境搭建、erlang客户端例子教程 1. rabbitMQ简介 rabbitmq起源于Advanced Message Queuing Protocol(AMQP,高级消息队列协议,参见 [AMQP-wiki]),AMQP从一开始就设计成为开放标...

问天小凯
2017/10/27
120
0
Jquery File upload 初探

官网:https://blueimp.github.io/jQuery-File-Upload/ 可以看到官方提供了几种不同的方案:我用的是basic plus ui 的样式 源码直接从github上下载即可: 要用到自己的项目里面,还是要注意几...

LonnyDong
2016/04/15
220
0
Elixir v1.2.0 正式发布,函数式编程语言

Elixir v1.2.0 正式发布,此版本新增 Erlang 18 和 Rebar 3 支持,还有一些语言特性改进: The addition of multi aliases/imports/require: Support for variables in map keys: Support fo......

oschina
2016/01/02
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
7
0
用最通俗的方法讲spring [一] ──── AOP

@[TOC](用最通俗的方法讲spring [一] ──── AOP) 写这个系列的目的(可以跳过不看) 自己写这个系列的目的,是因为自己是个比较笨的人,我曾一度怀疑自己的智商不适合干编程这个行业.因为在我...

小贼贼子
昨天
7
0
Flutter系列之在 macOS 上安装和配置 Flutter 开发环境

本文为Flutter开发环境在macOS下安装全过程: 一、系统配置要求 想要安装并运行 Flutter,你的开发环境需要最低满足以下要求: 操作系统:macOS(64位) 磁盘空间:700 MB(不包含 IDE 或其余...

過愙
昨天
6
0
OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
昨天
2.7K
16
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
昨天
42
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部