10.高级 | 10. Advanced
10 高级
10.1内存
高效编程的一个好的开始是知道不同的数据类型和操作需要多少内存。它与实现有关,Erlang数据类型和其他项消耗了多少内存,但下表显示了erts-8.0
OTP 19.0中系统的一些数字。
度量单位是记忆词。同时存在一个32位和64位的实现。因此一个字分别是4个字节或8个字节。
数据类型 | 内存大小 |
---|---|
Small integer 小整数 | 1个字。在32位体系结构上: -134217729 < i < 134217728 (28 bits). On 64-bit architectures: -576460752303423489 < i < 576460752303423488 (60 bits).。 |
Large integer 大整数 | 3..N字。 |
Atom 原子 | 1个字。一个原子引用到一个原子表中,这也消耗了内存。原子文本为此表中的每个独特原子存储一次。原子表不是垃圾收集的。 |
Float 浮点数 | 在32位架构上:4个字。在64位体系结构上:3个字。 |
Binary 二进制 | 3..6个字+数据(可以共享)。 |
List 列表 | 1个字+每个元素1个字+每个元素的大小。 |
String 字符串(与整数列表相同) | 1个字+每个字符2个字。 |
Tuple 元组 | 2个字+每个元素的大小。 |
Small Map 小地图 | 5个字+所有键和值的大小。 |
Large Map 大地图(> 32键) | N x F字+所有键和值的大小。N是Map中的键的数量。由于内部HAMT数据结构的概率性质,F是一个可以在1.6和1.8之间变化的稀疏因子。 |
PID | 1个字用于来自当前本地节点的进程标识符+ 5个字用于来自另一个节点的进程标识符。进程标识符引入进程表和节点表中,该表也消耗内存。 |
Port 端口 | 1个字用于来自当前本地节点的端口标识符+ 5个用于来自另一个节点的端口标识符的字。端口标识符引用端口表和节点表,这也消耗内存。 |
Reference 参考 | 在32位架构上:5个字用于来自当前本地节点的引用+ 7个字用于来自另一个节点的引用。在64位体系结构上:来自当前本地节点的引用为4个字,来自另一个节点的引用为6个字。引用引用了一个节点表,它也消耗了内存。 |
Fun 高阶函数 | 9..13个字+环境的大小。趣味指的是一张有趣的表格,它也会消耗内存。 |
Ets table Ets表 | 最初768个单词+每个元素的大小(6个字+ Erlang数据的大小)。表格在必要时增长。 |
Erlang process Erlang进程 | 生成时有338个字,包括233个字的堆。 |
10.2系统限制
Erlang语言规范对进程数量,原子长度等没有限制。但是,出于性能和内存节约的原因,在Erlang语言和执行环境的实际实现中始终存在限制。
流程 | 同时活跃的Erlang进程的最大数量默认为32,768。该限制可以在启动时进行配置。有关更多信息,请参阅ERTS的erl(1)手册页中的+ P命令行标志。 |
---|---|
已知节点 | 如果X上的Y存在任何pids,端口,引用或funs(Erlang数据类型),或者连接了X和Y,则节点X必须知道远程节点Y. 同时/节点已知的远程节点的最大数量受可用于节点名称的最大原子数限制。所有关于远程节点的数据,除了节点名称atom,都被垃圾回收。 |
连接的节点 | 同时连接的节点的最大数量受限于同时已知的远程节点的最大数量,可用的(Erlang)端口的最大数量或可用的最大套接字数量。 |
原子中的字符 | 255. |
原子 | 默认情况下,最大原子数为1,048,576。使用+ t选项可以提高或降低此限制。 |
你是桌子 | 缺省值是1400.可以使用环境变量ERL_MAX_ETS_TABLES更改它。 |
元组中的元素 | 元组中元素的最大数目是67,108,863(26位无符号整数)。显然,其他因素(如可用内存)可能会使创建该大小的元组变得困难。 |
二进制大小 | 在Erlang的32位实现中,536,870,911字节是可以使用位语法构建或匹配的最大二进制文件。在64位实现中,最大大小为2,305,843,009,213,693,951字节。如果超出限制,则比特语法构造会失败,并显示system_limit异常,而尝试匹配太大的二进制文件将失败。这个限制从R11B-4开始执行。在之前的Erlang / OTP版本中,通常对于太大的二进制文件的操作要么失败,要么给出不正确的结果。在将来的版本中,创建二进制文件的其他操作(如list_to_binary / 1)也可能会强制执行相同的限制。 |
Erlang节点分配的数据总量 | Erlang运行时系统可以使用完整的32位(或64位)地址空间,但操作系统通常会限制单个进程使用更少的进程。 |
节点名称的长度 | Erlang节点名称的形式为host @ shortname或host @ longname。节点名称用作系统中的原子,因此最大大小为255也适用于节点名称。 |
打开端口 | 同时打开的Erlang端口的最大数量通常默认为16,384。该限制可以在启动时进行配置。有关更多信息,请参阅ERTS erl(1)手册页中的+ Q命令行标志。 |
打开文件和套接字 | 同时打开的文件和套接字的最大数量取决于可用的Erlang端口的最大数量,以及特定于操作系统的设置和限制。 |
一个函数或乐趣的参数数目 | 255 |
运行时系统实例上的唯一引用 | 每个调度程序线程都有自己的一组引用,并且所有其他线程都有一组共享的引用。每套参考文献由2〜4个独特的参考文献组成。那就是可以在运行时系统实例上生成的唯一引用的总数是(NoSchedulers + 1)*(2⁶4 - 1)。如果一个调度程序线程每纳秒创建一个新的引用,那么引用最早将在超过584年后重新使用。也就是说,在可预见的将来,它们足够独特。 |
运行时系统实例上的唯一整数 | 有两种类型的唯一整数都是使用erlang创建的:unique_integer()BIF。创建的唯一整数:单调修饰符由一组2?4 - 1个唯一整数组成。没有单调修饰符由每个调度程序线程的一组2?4 - 1个唯一整数和一组由其他线程共享的2?4 - 1个唯一整数组成。(NoSchedulers + 1)*(2⁶4 - 1)如果每纳秒创建一个独特的整数,那么在超过584年后,最早将重新使用唯一整数。也就是说,在可预见的将来,它们足够独特。 |