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 是否以任何巧妙的方式实现记录复制和修改? 的相关文章

  • 如何检查两个变量是否指向内存中的同一个对象?

    例如 struct Foo lt a gt bar a str fn main let foo instance Foo bar bar let some vector Vec lt Foo gt vec foo instance asse
  • 如何在erlang中读取mnesia数据库的所有记录?

    我是 erlang 新手 我需要对从 mnesia 数据库获取的所有记录进行一些操作 Result mnesia dirty read mydatabase key1 key2 case Result of gt DEBUG No such
  • 虚拟内存澄清——大连续内存的分配

    我有一个应用程序 我必须在 Windows 上分配 使用运算符 new 相当大的内存空间 数百 MB 该应用程序是 32 位 我们现在不使用 64 位 即使在 64 位系统上也是如此 我启用了 LARGEADDRESSAWARE 链接器选项
  • iOS 内存警告

    我正在尝试使用从 Parse 数据库下载的图像填充集合视图 但我收到内存警告 然后偶尔崩溃 有谁知道其他应用程序如何设法呈现这么多图像而不崩溃 有人可以告诉我如何优化我已有的东西吗 这是所有相关代码 https gist github co
  • 为什么 epmd 进程不退出?

    在我退出 erlang shell 后 epmd 进程仍然存在 这是一个错误还是一个功能 这是很正常的 EPMD 是一个主机守护进程 当人们打算使用分布式节点时 就需要它的存在 当仅在同一台机器上使用多个节点时 它也很有用
  • 为什么 UIWebView 吃这么多内存?

    我正在使用 UIWebView 为我的 iPad 应用程序加载纯文本 HTML 页面 HTTP页面的大小只有40KB 但是当我使用仪器监控加载 UIWebView 的内存使用情况时 我发现它消耗了大约 20MB 内存 如果我滚动 Web 视
  • 抛出错误的分配

    我在尝试使用升压托管共享内存时收到 bad alloc 我从他们的快速指南中复制了升压示例 以供不耐烦的人使用 并结合了我自己的更改 我的代码如下 我注释掉了示例内容并在下面编写了自己的代码 我还进行了一些调试和测试 有人有什么想法吗 任何
  • 如何分析堆转储

    我成功地生成了我的应用程序机器的堆转储 但我不知道如何分析它 有人可以告诉我怎么做吗 在 Sun Solaris 上使用适用于 Java 的 jhat 实用程序 一个很好的例子在这里https blogs oracle com alanb
  • java内存不足然后退出

    我有一个必须分析大文件的软件 限制输入或提供无限内存都不是一个选择 所以我必须忍受飞行的 OOME 因为 OOME 只杀死线程 所以我的软件运行在一些糟糕的状态 从外面看一切都很好 因为进程正在运行 但在内部却是脑死亡 我想拔掉它的插头 但
  • gen_server中的数据在supervisor重启后还会保留吗?

    我有一个启动许多 gen server 的主管 每个 gen server 都有大量的数据加载 这需要花费大量的时间 我想知道当错误发生时 存储在 gen server 状态及其进程字典中的数据是否会保留以供下次启动 这样我就不需要再次初始
  • C# 记录类型:记录子类之间的相等比较

    给定父记录类型 public record Foo string Value 和两个记录子类Bar and Bee我想知道是否可以实施Equals在基类中 因此 Foo Bar 或 Bee 的实例都被考虑equal基于Value 两者都与E
  • Erlang:有“epmd”的 API 吗?

    有没有办法查询 epmd 守护进程管理的名称表 The nodes 函数在这方面不是很有帮助 注意 我正在寻找 APIaside解析通过 stdout 生成的输出 要查询 epmd 可见的节点 请调用 EpmdModule net kern
  • 当 InternalsVisibleToAttribute 不是一个选项时,如何使用反射对程序集中的内部(VB 中的 Friend)类进行单元测试?

    我有一个包含两个项目的解决方案 Company Project vbproj Company Project Tests vbproj 内Company Project vbproj集会 我有课FriendClass vb哪个范围是Frie
  • 内存错误:numpy.genfromtxt()

    我有一个 50 000x5 000 矩阵 浮点 文件 使用时x np genfromtxt readFrom dtype float 要将文件加载到内存中 我收到以下错误消息 文件 C Python27 lib site packages
  • 不同翻译单元中字符串文字的内存地址是否相同?

    假设我们有以下 cpp 文件 include
  • 限制 Java 进程的总内存消耗(在 Cloud Foundry 中)

    与这两个问题相关 如何设置JVM的最大内存使用量 https stackoverflow com questions 1493913 how to set the maximum memory usage for jvm 什么会导致 jav
  • 如何在 gen_servers 中进行选择性接收?

    我将大部分应用程序移植到 OTP 行为 但我陷入困境 我不知道如何使用 gen server 进行选择性接收 如果没有任何回调函数子句与消息匹配 则不会将消息放回邮箱 而是会出错 现在 无论我走到哪里 人们都称赞选择性接收 无论我走到哪里
  • R foreach问题(某些进程返回NULL)

    我遇到了问题foreach我正在 R 中使用的程序的一部分 该程序用于运行不同参数的模拟 然后将结果返回到单个列表 然后用于生成报告 当并非所有分配的模拟运行都在报告上实际可见时 就会出现问题 从各方面来看 似乎只有分配的运行的一个子集实际
  • 如何解决内存碎片

    我们偶尔会遇到这样的问题 长时间运行的服务器进程 在 Windows Server 2003 上运行 由于内存分配失败而引发异常 我们怀疑这些分配由于内存碎片而失败 因此 我们一直在寻找一些可能对我们有帮助的替代内存分配机制 我希望有人能告
  • Pandas、大数据、HDF 表以及调用函数时的内存使用情况

    简短的问题 当 Pandas 在 HDFStore 上工作时 例如 mean 或 apply 它是否将内存中的完整数据作为 DataFrame 加载 还是将逐条记录作为 Serie 进行处理 详细描述 我必须处理大型数据文件 并且我可以指定

随机推荐

  • 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 是唯一的实体 然而 从语言实