erlang 是否以任何巧妙的方式实现记录复制和修改?

2023-12-23

given:

-record(foo, {a, b, c}).

我做了这样的事情:

Thing = #foo{a={1,2}, b={3,4}, c={5,6}},
Thing1 = Thing#foo{a={7,8}}.

从语义角度来看,Thing 和 Thing1 是唯一的实体。然而,从语言实现的角度来看,制作 Thing 的完整副本来生成 Thing1 会非常浪费。例如,如果记录大小为一兆字节,并且我制作了一千个“副本”,每个副本修改了几个字节,那么我就烧毁了一个千兆字节。如果内部结构跟踪父结构的表示,并且每个派生结构以指示其自己的更改但保留其他人的版本的方式标记该父结构,则可以以最小的内存开销创建派生结构。

我的问题是这样的:erlang 是否在内部做了一些聪明的事情来保持通常的 erlang 乱写的开销?

Thing = #ridiculously_large_record,
Thing1 = make_modified_copy(Thing),
Thing2 = make_modified_copy(Thing1),
Thing3 = make_modified_copy(Thing2),
Thing4 = make_modified_copy(Thing3),
Thing5 = make_modified_copy(Thing4)

……最小化?

我之所以这么问,是因为如果是这种情况,我进行跨进程通信的方式将会发生很多变化。


垃圾收集和内存分配的确切工作原理只有少数人知道。值得庆幸的是,他们非常乐意分享他们的知识,以下内容基于我从 erlang-questions 邮件列表以及与 OTP 开发人员讨论中学到的知识。

当在进程之间发送消息时,内容总是被复制,因为进程之间没有共享堆。唯一的例外是大于 64 字节的二进制文件,其中仅复制引用。

在一个进程中执行代码时,仅更新部分内容。让我们分析元组,因为这是您提供的示例。

元组实际上是一种结构,它将对实际数据的引用保留在堆上的某个位置(小整数除外,也许还有一种我不记得的数据类型)。当您更新元组时,例如使用setelement/3,创建一个新元组并替换给定元素,但是对于所有其他元素,仅复制引用。有一个例外 http://www.erlang.org/doc/efficiency_guide/commoncaveats.html#id62422我一直无法利用这一点。

垃圾收集器跟踪每个元组并了解何时可以安全地回收不再使用的任何元组。元组引用的数据可能仍在使用中,在这种情况下,不会收集数据本身。

一如既往,Erlang 为您提供了一些工具来准确了解正在发生的事情。效率指南 http://www.erlang.org/doc/efficiency_guide/processes.html#id67714详细说明如何使用erts_debug:size/1 and erts_debug:flat_size/1了解在进程内部使用和复制时数据结构的大小。跟踪工具还可以让您了解垃圾收集的时间、内容和数量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

erlang 是否以任何巧妙的方式实现记录复制和修改? 的相关文章

  • 如何快速将6字节无符号整数复制到内存区域?

    我需要将 6 字节整数值复制到内存区域中 从其开头开始并尽可能快地复制 如果硬件支持这样的操作 我想使用它 我现在使用的是 x64 处理器 编译器是 GCC 4 6 3 The memset不适合这项工作 因为它只能复制字节 这std fi
  • Python AST 中的 ExtSlice 节点表示什么语法?

    我正在费力地浏览Pythonast模块并且无法弄清楚切片定义 slice Ellipsis Slice expr lower expr upper expr step ExtSlice slice dims Index expr value
  • Linux 内核线程没有地址空间

    为什么Linux内核线程没有地址空间 对于任何要执行的任务 它都应该有一个内存区域 对吗 内核线程的文本和数据去了哪里 内核线程确实有一个地址空间 只是他们都有同一个 这并不妨碍它们各自拥有不同的堆栈 文本和数据放置在内核地址空间 由所有线
  • Biopython 成对比对导致循环运行时分段错误

    我正在尝试运行成对全局对齐方法biopython循环大约 10000 对字符串 每个字符串平均长度为 20 个字符 对一对序列运行该方法效果很好 但在循环中运行此操作 低至 4 对 会导致分段错误 如何解决这个问题 from Bio imp
  • scala.Equals 特征中的 canEqual()

    从源代码来看scala Equals scala here https github com scala scala blob 2 11 x src library scala Equals scala package scala trai
  • 在 Erlang 中展平嵌套列表的列表

    我正在做练习Erlang编程 问题是 编写一个函数 给定一个嵌套列表的列表 该函数将返回一个平面列表 例子 flatten 1 2 3 4 5 6 1 2 3 4 5 6 提示 使用concatenate解决flatten 这是我的conc
  • C# 中类实例的内存使用情况[重复]

    这个问题在这里已经有答案了 可能的重复 C NET 对象使用多少内存 https stackoverflow com questions 426396 how much memory does a c net object use 就像标题
  • 为什么MIPS中内存地址加4?

    如果某些内容存储在 0x1001 0000 处 则下一个内容将存储在 0x1001 0004 处 如果我是正确的 32 位架构中的内存块每个都是 32 位 那么0x1001 0002会指向32位的后半部分吗 首先 MIPS 架构中的内存地址
  • 如何使用 ibrowse 将附件上传到 CouchDB 中的文档?

    我已经使用curl上传图像文件Penguins jpg 例如 C curl gt curl vX PUT H Content Type image jpeg http localhost 5984 DBNAME DOCID Penguins
  • 这个对象的内存会是什么样子?

    我想知道这个类 它的对象 的内存布局是什么样的 class MyClass string myString int myInt public MyClass string str int i myString str myInt i MyC
  • Erl 无法连接到本地 EPMD。为什么?

    Erlang R14B04 erts 5 8 5 source 64 bit rq 1 async threads 0 kernel poll false Eshell V5 8 5 abort with G root ip 10 101
  • Android - 减少位图绘制的内存使用量

    我的应用程序中有一张地图 显示了 Gowalla 的位置 我使用带有简单默认标记的 ItemizedOverlay 但在绘制项目时 我将默认标记替换为从 Gowalla 下载 9 并缓存在磁盘上 的位置图标 问题是 如果屏幕上有很多位置 例
  • DbConnection 不带 Db,使用内存中的 DataSet(或类似的)作为源

    我正在尝试对一些 NET 类进行单元测试 这些类 出于良好的设计原因 需要 DbConnections 来完成其工作 对于这些测试 我在内存中有某些数据可以作为这些类的输入 内存中的数据可以很容易地表示为 DataTable 或包含该 Da
  • RenderTargetBitmap 内存泄漏

    我正在尝试使用 RenderTargetBitmap 渲染图像 每次我从 RenderTargetBitmap 创建一个实例来渲染图像时 内存都会增加 完成后内存永远不会释放 这是代码 RenderTargetBitmap rtb new
  • Erlang:如何将小数转换为填充零的十六进制字符串

    我想在 Erlang 中将 42 基数 10 转换为 000002A 基数 16 我在网上找到了一些提示 io format 8 0B n 42 gt 00000042 And io format 16B n 42 gt 2A 但我似乎无法
  • Windows 内存映射文件

    我正在尝试研究 Windows 内核在内存映射文件 虚拟内存方面的行为 具体来说 我感兴趣的是确定内存映射文件的内容 由 Windows 刷新到磁盘的频率以及 Windows 使用什么标准来决定是时候这样做 我在网上做了一些研究 除了 MS
  • WaitForSingleObject 是否充当内存屏障?

    昨天一个关于双重检查锁定的问题引发了一系列的想法 让我对一个简单的情况感到不确定 在下面的代码中 是否可以点击printf 不再同步 在这个简单的示例中 这些值可能位于同一缓存行上 因此我认为这种可能性较小 假设一开始可能性 gt 0 如果
  • 如何通过 SSL 从 Phoenix Web App 连接到 PostgreSQL?

    When trying to run Elixir Phoenix Web Application using PostgreSQL Database hosted 3rd party Database as a Service Azure
  • 从 QML 实例化 C++ 对象会产生巨大的内存使用开销

    实例化一个QObjectC 堆中的派生类为每个对象提供了大约 160 个字节 通过注册相同的对象qmlRegisterType 用于从 QML 创建并通过以下方式动态创建对象createObject 每个对象给我 2000 多个字节 这是完
  • gcc 不太可能使用宏

    我正在编写一段关键代码 其逻辑大致如下 if expression is true do something with extremely low latency before the nuke blows up This branch i

随机推荐

  • Discord.py 狙击命令

    我试图发出一个命令 让机器人 狙击 最后删除的消息 这是我当前的代码 snipe message content None snipe message author None client event async def on messag
  • 如何在 Django 管理中使用 HTML5 颜色选择器

    我正在尝试在 Django 的管理页面中实现 HTML5 颜色选择器 这是我的模型 model py class Category models Model color models CharField max length 7 表格如下
  • 使用 sys/mount.h 挂载 ISO

    我正在尝试在 Linux 中的 C 程序中挂载 ISO 文件 我知道 linux 命令可以实现此目的 即 mount o Loop Test iso mnt myISO 但是 mount 2 手册页声明了以下安装原型 int mount c
  • 字符串到 java.sql.Date

    我意识到这个问题已经被问了很多 我确实看过 我花了几个小时环顾四周并试图找出答案 我应该制作一个程序 在数据库中存储相当于约会列表的内容 其中包含描述 日期 开始时间和结束时间 它必须接受用户的输入来添加或取消约会 据我所知 这意味着我需要
  • 如何在查询中比较模型的两个字段?

    我正在编写一个管理命令 它将用建议价格过滤产品的原始价格 我有一个产品模型 如下所示 class Suggestion models Model price models IntegerField class Product models
  • Python 子进程 wait() 在 Mavericks 和 Yosemite 上的行为不同

    我最近升级到优胜美地 一些用于在 Mavericks 上运行的 Python 脚本被挂起 我的版本是2 7 8 我创建了一个测试用例 import subprocess cat subprocess Popen top l 1 stdout
  • 'And' 与 'AndAlso' 与 vb.net 中的 linq 有关系吗?

    在 vb net 的 linq 查询中使用 And 或 AndAlso 有什么关系吗 我知道在正常操作中 AndAlso 是短路的 因此通常会更快 但我不知道这是否会延续到 linq 查询中 linq 查询是针对数据库还是针对内存集合 这很
  • 固定大小的并发Map

    我需要一张满足以下要求的地图 应该是高并发的 这put get and remove 方法可以由多个线程同时调用 它应该是固定大小的 如果尺寸HashMap达到最大值 例如 10000 则不允许向映射添加新条目 它不能是 LRU 缓存 其中
  • JSON 格式的 Jquery.ajax API 请求在 Chrome 中导致“Uncaught SyntaxError: Unexpected token :”

    我正在尝试查询http developer pintlabs com brewerydb api documentation http developer pintlabs com brewerydb api documentation使用
  • 如何正确刷新curses窗口?

    while 1 window addstr 0 0 abcd window refresh window尺寸为全终端尺寸 大到足以容纳abcd If abcd 被修改为更短的字符串 例如 xyz 然后在终端上我会看到 xyzd 我到底做错了
  • PHP 的 finfo::buffer 如何被欺骗?

    处理上传的文件时 FILES foo type 一点也不可靠 我发现如果您更改 OS X 上的扩展名 类型 会自动更改 相反 请考虑 fileInfo new finfo FILEINFO MIME mimeType fileInfo gt
  • NuGet (NuPack) 智能感知(Visual Studio 包管理器控制台)

    我的 NuGet 智能感知未显示 或者也许有某种捷径 我不认为智能感知是您所期望的 就像在带有可用选项列表的下拉列表中一样 From this page http nuget codeplex com wikipage title Gett
  • 适用于 .NET 的无锁和线程安全 IList

    是否有实现 IList 的无锁且线程安全的数据结构 当然 无锁是指不使用 NET 中的锁定原语而是使用互锁操作 原子操作来实现线程安全的实现 显然在并发数据结构下没有一个 有人见过漂浮在空中的吗 我见过一个java实现氨基 CBBs htt
  • 如何在极坐标中绘制颤动图

    如何在极坐标中绘制颤动图 我有 r 和 theta 方面的数据 我试过了 import numpy as np radii np linspace 0 5 1 10 thetas np linspace 0 2 np pi 20 theta
  • 如何在 TypeScript 中正确导出和导入模块

    Note 我知道有很多关于这个主题的帖子 而且我已经审阅了很多帖子但没有成功 请参阅本文底部的参考资料 我正在尝试使用 Visual Studio Code 在 TypeScript 中运行一个非常简单的测试 其中我在一个文件中声明一个类并
  • 谷歌地方 api 自动完成 - 添加点击事件

    我正在附加一个搜索结果到 google place javascript api 自动完成 到目前为止我正在这样做 var autocomplete function initialize var myLatlng new google m
  • 如何检测“保存/打开/取消”对话框中单击了哪个按钮?

    我有一个网页 会员可以在其中下载不同类型的文件 我不想获取有关每个成员下载了哪些文件以及下载次数的信息 当用户想要下载文件时 他会弹出浏览器 其中有 3 个选择 打开 保存 和 取消 浏览器中的文件对话框 我只想在单击打开 保存按钮时更新下
  • C 中的变量存储在内存的什么位置?

    考虑到内存分为四段 数据段 堆段 堆栈段和代码段 其中分别有全局变量 静态变量 常量数据类型 局部变量 在函数中定义和声明 变量 在主函数中 指针 并且动态分配的空间 使用 malloc 和 calloc 存储在内存中 我认为他们的分配方式
  • QDialog 未从主窗口打开(pyQt)

    我试图通过单击主窗口中的按钮来启动一个对话框 这是我修改的 qtdesigner 生成的 代码只是为了测试它 我已经设置了 showDial 函数以在单击按钮时显示拨号盘 但它不起作用 from PyQt4 import QtCore Qt
  • erlang 是否以任何巧妙的方式实现记录复制和修改?

    given record foo a b c 我做了这样的事情 Thing foo a 1 2 b 3 4 c 5 6 Thing1 Thing foo a 7 8 从语义角度来看 Thing 和 Thing1 是唯一的实体 然而 从语言实