memory - erlang中的数组实现

标签 memory erlang immutability

我的问题是,数组是如何在 Erlang 中实现的,而不是列表。

使用不可变类型做类似的事情,

move ([X | Xs], Ys) ->
    [X | Ys].

Ls = move([1,2,3], [2,3,4])

将占用堆中的常量内存,因为这都是引用工作。

但是对于数组中的相同内容
move (A1, A2) ->
    array:set(0, array:get(0,A1),A2).

A1 = array:from_list([1,2,3]).
A2 = array:from_list([0,2,3,4]).
A3 = move(A1,A2).

move这里使用与 A2 成比例的大小,还是能够像数组一样在恒定空间中执行此操作?

最佳答案

(希望)把事情弄清楚一点。请记住,在 Erlang 全部 数据是不可变的!这会深刻影响您处理数据的方式。
array模块构建嵌套元组的结构,其中包含数据的所有数组槽都处于同一级别。每个元组的大小为 10,因此对于数组访问,我们有 O(lg10(N))。像这样使用嵌套结构在具有不可变数据的语言中很常见。您可以将数组保存在一个平面元组中,这样可以快速读取,但写入会变得很慢,并且对于大型数组/元组会占用内存,因为每次写入都需要创建一个新元组。使用树结构意味着在写入中创建的数据要少得多。

您的 move/2函数影响内存使用在一定程度上取决于您是写入数组中已使用的插槽还是未使用的插槽。如果插槽已在使用中,则生成的内存使用量将相同。如果您正在写入以前未使用的插槽,那么您可能需要增加数组,这意味着将使用更多内存。

这与您的列表案例完全相同。

它还取决于是否存在对旧数据结构的任何剩余引用。

关于memory - erlang中的数组实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16447921/

相关文章:

linux - 如何从 Linux 中的用户空间访问物理地址?

c# - 迭代大型数据集时出现 OutOfMemoryException

erlang - 我无法在我的 **helloworld** 项目中使用 `ejabberd_auth`

domain-driven-design - DDD : how to keep a complex value object immutable?

java - 修复 Android 内存不足问题

c - C 中的数组大小和地址

debugging - erlang debug_info 选项 - 在模块内部还是在编译期间?

java - 如何与一个 Erlang 节点中的特定进程进行通信?

java - 如何创建一个交换可变类型的方法? (自然数)Java

java - Guava ImmutableMap Builder 语法