Arrays “是否存在Erlang阵列”;具有定义的表示形式“quot;”;?

Arrays “是否存在Erlang阵列”;具有定义的表示形式“quot;”;?,arrays,erlang,storage,portability,Arrays,Erlang,Storage,Portability,上下文: 在异构节点上运行的Erlang程序,用于检索和存储数据 来自Mnesia数据库。这些数据库条目将长期使用 时间(例如跨多个Erlang版本发布)仍然以 Erlang对象(即无序列化)。在存储的信息中,有 阵列目前有两种用途: 大型(最多16384个元素)阵列。快速访问元素 使用其索引是选择此类集合的基础。 一旦创建了数组,就永远不会修改元素 小型(最多64个元素)阵列。访问大多使用索引完成,但也有一些迭代(foldl/foldr)。经常读取和更换元件。集合的大小保持不变 问题: 声明“

上下文:

在异构节点上运行的Erlang程序,用于检索和存储数据 来自Mnesia数据库。这些数据库条目将长期使用 时间(例如跨多个Erlang版本发布)仍然以 Erlang对象(即无序列化)。在存储的信息中,有 阵列目前有两种用途:

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

  • 小型(最多64个元素)阵列。访问大多使用索引完成,但也有一些迭代(foldl/foldr)。经常读取和更换元件。集合的大小保持不变

  • 问题:

    声明“该陈述不适用 显然,数组不应该在我的上下文中使用:包含数组的数据库条目可能会被删除 根据执行程序的节点和 对数组实现方式的未经宣布的更改将使它们无法使用

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

    数组是由嵌套的元组和整数组成的元组,每个元组的大小固定为10,表示一段单元格。在当前未使用段的情况下,整数(10)用作占位符。如果没有抽象,我想这是壁橱的等价物。你确实可以从otp复制阵列模块,并添加到你自己的应用程序中,因此它将是一个稳定的表示

    至于您应该使用什么,而不使用数组取决于数据以及您将如何处理它。若数组中的数据是固定的,那个么元组会使读取/查找具有恒定的访问时间。否则,列表听起来像是赢家,不管是列表列表列表,元组列表,等等。然而,这又是一次冒险,因为我不知道你的数据或你如何使用它

    请参见此处的实现:

    另请参见Robert Virding关于阵列实现的回答:

    还有弗雷德·赫伯特在书中对阵列的看法

    显示阵列结构的示例:

    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> 
    

    非常感谢。出于某种原因,我认为在运行时确定大小的元组是不可能的。结果是(通过列表到元组),对于我的大型数组来说,它看起来确实是一个很好的解决方案。我有点恼火,我不能指定
    tuple(my_type())
    作为透析器的类型。你知道为什么
    10
    被用作缺少的tuple的占位符,而不是
    未定义的