arrays - 是否有“具有定义表示”的 Erlang 数组?
问题描述
语境:
Erlang 程序在异构节点上运行,从 Mnesia 数据库中检索和存储数据。这些数据库条目打算长期使用(例如跨多个 Erlang 版本发布)保持 Erlang 对象的形式(即没有序列化)。在存储的信息中,数组目前有两种用途:
大型(最多 16384 个元素)数组。使用索引快速访问元素是选择此类集合的基础。一旦创建了数组,就永远不会修改元素。
小型(最多 64 个元素)数组。访问大多使用索引完成,但也有一些迭代(foldl/foldr)。元素的读取和替换都经常进行。集合的大小保持不变。
问题:
Erlang 关于数组的文档指出“该表示未记录在案,如有更改,恕不另行通知。” 显然,在我的上下文中不应该使用数组:包含数组的数据库条目可能会根据执行程序的节点有不同的解释,并且对数组实现方式的未宣布的更改会使它们无法使用。
我注意到 Erlang 使用“ordsets”/“orddict”来解决与“sets”/“dict”类似的问题,因此正在寻找“array”等价物。你知道吗?如果不存在,我的策略很可能是使用列表列表来替换我的大数组,并使用 orddict(以索引为键)来替换较小的数组。有更好的解决方案吗?
解决方案
数组是嵌套元组和整数的元组,每个元组的大小固定为 10 并表示一个单元格段。在当前未使用段的情况下,整数 (10) 充当占位符。这没有抽象是我想壁橱等价物。您确实可以从 otp 复制数组模块并添加到您自己的应用程序中,因此它将是一个稳定的表示。
至于你应该使用什么没有数组取决于数据以及你将如何处理它。如果您的数组中的数据是固定的,那么一个元组就会生成,它具有恒定的读取/查找访问时间。否则,列表听起来像是赢家,无论是列表列表、元组列表等。但是,再一次,这是在黑暗中的一枪,因为我不知道您的数据或您如何使用它。
在此处查看实现:https ://github.com/erlang/otp/blob/master/lib/stdlib/src/array.erl
另请参阅 Robert Virding 对数组实现的回答:Arrays implementation in erlang
Fred Hebert 在A Short Visit to Common Data Structures中对数组的看法
显示数组结构的示例:
1> A1 = array:new(30).
{array,30,0,undefined,100}
2> A2 = array:set(0, true, A1).
{array,30,0,undefined,
{{true,undefined,undefined,undefined,undefined,undefined,
undefined,undefined,undefined,undefined},
10,10,10,10,10,10,10,10,10,10}}
3> A3 = array:set(19, true, A2).
{array,30,0,undefined,
{{true,undefined,undefined,undefined,undefined,undefined,
undefined,undefined,undefined,undefined},
{undefined,undefined,undefined,undefined,undefined,
undefined,undefined,undefined,undefined,true},
10,10,10,10,10,10,10,10,10}}
4>
推荐阅读
- excel - 宏看不到工作表 - “运行时错误 9”
- components - a-frame superhands 定制手模型
- python - 在 tqdm 中的 for 循环后更改描述
- xml - 搜索 xml 到 jekyll 转换器
- r - R:有没有办法在两个不同的 dfs 中找到与两个字符串列的相同第一个元素的部分字符串匹配?
- node.js - 向设备组 firebase node.js 发送通知
- javascript - 在工作表中自动发送电子邮件时自动检测日期
- c# - 如何在 Itext7 中使用任何印地语字体?
- vb.net - 字符串列表的大小
- flutter - 如何使用 add2calendar 包制作动态 Flutter 按钮?