首页 > 解决方案 > 是否有“具有定义表示”的 Erlang 数组?

问题描述

语境:

Erlang 程序在异构节点上运行,从 Mnesia 数据库中检索和存储数据。这些数据库条目打算长期使用(例如跨多个 Erlang 版本发布)保持 Erlang 对象的形式(即没有序列化)。在存储的信息中,数组目前有两种用途:

  1. 大型(最多 16384 个元素)数组。使用索引快速访问元素是选择此类集合的基础。一旦创建了数组,就永远不会修改元素。

  2. 小型(最多 64 个元素)数组。访问大多使用索引完成,但也有一些迭代(foldl/foldr)。元素的读取和替换都经常进行。集合的大小保持不变。

问题:

Erlang 关于数组的文档指出“该表示未记录在案,如有更改,恕不另行通知。” 显然,在我的上下文中不应该使用数组:包含数组的数据库条目可能会根据执行程序的节点有不同的解释,并且对数组实现方式的未宣布的更改会使它们无法使用。

我注意到 Erlang 使用“ordsets”/“orddict”来解决与“sets”/“dict”类似的问题,因此正在寻找“array”等价物。你知道吗?如果不存在,我的策略很可能是使用列表列表来替换我的大数组,并使用 orddict(以索引为键)来替换较小的数组。有更好的解决方案吗?

标签: arrayserlangstorageportability

解决方案


数组是嵌套元组和整数的元组,每个元组的大小固定为 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> 

推荐阅读