Erlang 进程和消息传递架构

2024-04-03

我手头的任务是读取大文件的行,处理它们,并返回有序结果。

我的算法是:

  1. 从评估工作负载的主进程开始(写在文件的第一行)
  2. 生成工作进程:每个工作进程将使用 pread/3 读取文件的一部分,处理这部分,并将结果发送给 master
  3. master接收所有子结果,排序,返回 所以工人之间基本上不需要沟通。

我的问题:

  1. 如何找到erlang进程数和核心数之间的最佳平衡点?因此,如果我为每个处理器核心生成一个进程,我的 cpu 是否会被充分利用?
  2. pread/3如何到达指定行;它会迭代文件中的所有行吗? pread/3 是并行文件读取的好计划吗?
  3. 从进程A向B发送一条大消息好还是发送N条小消息好?我在下面的链接中找到了部分答案,但我希望进一步详细说明
    Erlang消息传递架构 https://stackoverflow.com/questions/30710923/erlang-message-passing-architecture

  1. Erlang 进程很便宜。您可以自由(并鼓励)使用超出您拥有的核心数量的核心。对于您的问题来说,实际情况可能存在上限(在每行一个进程中加载​​ 1TB 的数据要求有点高,具体取决于行大小)。

    当您不知道时,最简单的方法就是让用户决定。这意味着你可以决定生成N工人,并在他们之间分配工作,等待回复。更改时重新运行程序N如果你不喜欢它的运行方式。

    更棘手的方法是对大量时间进行基准测试,选择您认为有意义的最大值,将其放入池库中(如果您愿意的话;有些池用于预分配资源,有些池用于可调整大小的资源),并选择一种一刀切的解决方案。

    但实际上,不存在简单的“最佳核心数量”。您可以在 50 个进程上运行它,如果需要,也可以在其中 65,000 个进程上运行;如果任务是极其并行的,那么虚拟机应该能够利用其中的大部分任务并使核心饱和。

-

  1. 并行文件读取是一个有趣的问题。它可能会更快,也可能不会更快(正如直接评论所提到的),并且如果每行上的工作足够小以至于读取文件的成本最大,那么它可能只代表加速。

    棘手的一点确实是这样的功能pread/2-3需要一个字节偏移量。你的问题的措辞让你担心lines文件的。因此,您传递给工作人员的字节偏移量最终可能会跨越一条线。如果你的区块最终出现在这个词上my in this is my line\nhere it goes\n,一个工人会看到自己有一条不完整的线,而另一个工人只会报告my line\n,缺少之前的this is.

    一般来说,这种烦人的事情会导致你让第一个进程拥有该文件并对其进行筛选,只是将要处理的文本片段交给工作人员;该流程将充当某种协调员。

    该策略的好处在于,如果主进程知道作为消息发送的所有内容,那么它也知道何时收到所有响应,从而可以轻松知道何时返回结果。如果一切都是脱节的,那么你必须相信首发者和工人都会告诉你“我们都失业了”作为一组不同的独立消息来了解。

    在实践中,您可能会发现最有帮助的是了解有关文件操作的有助于硬件寿命的操作,而不仅仅是“有多少人可以同时读取该文件”。只有一个硬盘(或SSD),所有数据无论如何都要经过它;最终访问的并行性可能会受到限制。

-

  1. 使用对您的程序有意义的消息。性能最佳的程序将拥有许多能够完成工作的进程,而无需传递消息、通信或获取锁。

    一个更现实的高性能程序将使用非常少的非常小的消息。

    这里有趣的是,你的问题本质上是基于数据的。所以你可以做一些事情:

    • 确保您以二进制格式读取文本;大型二进制文件(> 64b)在全局二进制堆上分配,通过引用计数进行共享和 GC
    • 提交有关需要做什么的信息,而不是执行该操作的数据;这个需要测量,但是主导进程可以检查文件,记下行结束的位置,然后将字节偏移量交给工作人员,以便他们可以自己读取文件;请注意,您最终将读取文件两次,因此如果内存分配不是您的主要开销,这可能会更慢
    • 确保文件已读入raw or ram模式;其他模式使用中间人进程来读取和转发数据(如果您通过集群 Erlang 节点中的网络读取文件,这非常有用);raw and ram模式将文件描述符直接提供给调用进程,并且速度要快得多。
    • 首先要担心编写一个清晰、可读且正确的程序。只有当它太慢时才应该尝试重构和优化它;第一次尝试时您很可能会发现它足够好。

我希望这有帮助。

附:您可以首先尝试非常简单的方法:

  1. either:

    • 立即读取整个文件{ok, Bin} = file:read_file(Path)和分割线(与binary:split(Bin, <<"\n">>, [global])),
    • use {ok, Io} = file:open(File, [read,ram])然后使用file:read_line(Io)重复地在文件描述符上
    • use {ok, Io} = file:open(File, [read,raw,{read_ahead,BlockSize}])然后使用file:read_line(Io)重复地在文件描述符上
  2. call rpc:pmap({?MODULE, Function}, ExtraArgs, Lines)自动并行运行所有内容(它将每行生成一个进程)

  3. call lists:sort/1关于结果。

然后,如果您发现每个步骤有问题,您可以从那里完善它们。

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

Erlang 进程和消息传递架构 的相关文章

  • 并发.futures问题:为什么只有1个worker?

    我正在尝试使用concurrent futures ProcessPoolExecutor并行化串行任务 串行任务涉及从数字范围中查找给定数字的出现次数 我的代码如下所示 在执行过程中 我从任务管理器 系统监视器 顶部注意到 尽管给定了 m
  • 并发 log4j

    我有自己的日志引擎 它将日志写入带有阻塞队列的单独线程上 为了使用 标准软件 我正在考虑切换到 log4j 我不希望我的高并发软件因日志命令而变慢 这些日志命令在调用命令时将所有内容写入磁盘 log4j 可以用作垃圾箱吗 Log4j 是大多
  • 在 Erlang 中展平嵌套列表的列表

    我正在做练习Erlang编程 问题是 编写一个函数 给定一个嵌套列表的列表 该函数将返回一个平面列表 例子 flatten 1 2 3 4 5 6 1 2 3 4 5 6 提示 使用concatenate解决flatten 这是我的conc
  • 如何在Linux中为特定程序设置进程ID

    我想知道是否有某种方法可以在运行某些应用程序之前强制使用 Linux 的某些特定进程 ID 我需要提前知道进程ID 实际上 有一种方法可以做到这一点 自内核 3 3 设置了 CONFIG CHECKPOINT RESTORE 在大多数发行版
  • 如何在 ruby​​ 中后台运行多个外部命令

    给定这个 Unix shell 脚本 test sh bin sh sleep 2 sleep 5 sleep 1 wait 时间 test sh real 0m5 008s user 0m0 040s sys 0m0 000s 如何在 U
  • Python中的键盘可中断阻塞队列

    It seems import Queue Queue Queue get timeout 10 键盘可中断 ctrl c 而 import Queue Queue Queue get 不是 我总是可以创建一个循环 import Queue
  • 进程终止时释放资源

    当进程被任务管理器等进程终止时 如何释放资源 有没有办法在进程关闭之前调用函数 如果您的进程被终止 您实际上无能为力 根据定义 杀死一个进程就是杀死它 该进程没有机会运行任何代码 这很大程度上是 设计使然 想象一下 您可以注册一个例程 当您
  • Java并发中的AbstractQueuedSynchronizer

    What is AbstractQueuedSynchronizer在Java中concurrent locks包用来做什么 有人可以阐明它的方法吗doAcquireInterruptibly and parkAndCheckInterru
  • 在 Perl 中,如何从父进程向子进程发送消息(或信号),反之亦然?

    我正在编写一个管理多进程的程序 这就是我所做的 而且效果很好 但现在 我想将消息从子进程发送到父进程 反之亦然 从父进程到子进程 你知道最好的方法吗 你知道我所做的是否是我想要的正确方法 从子进程到父进程发送消息 信号或共享内存 反之亦然
  • 如何使用 python 显示当前用户的进程列表?

    我知道它与 proc 有关 但我不太熟悉它 教科书的答案是使用psutil像这样的模块 import psutil getpass os user name getpass getuser process dict proc pid pro
  • 将 erlang shell 作为守护进程/服务运行

    显然 我有一个在 Erlang shell 中运行的 Erlang 程序 我想监视它 这就是我要的 当机器启动时 Erlang shell 应该随之启动 并且在 shell 中运行的程序也应该随之启动 如果 Erlang shell 由于某
  • 捕获由纯 C++ dll 中的 MFC 应用程序生成的 Windows 消息

    首先 这可能吗 我有一个与某些硬件接口的第三方 dll 它是用MFC编写的 我 从 dll 供应商处 收到了一个示例 Visual Studio 2010 解决方案 该解决方案只有一个项目 调用相关第三方 dll 的 MFC 应用程序 ex
  • 在 x86-64 CPU 上通过交叉修改代码重现意外行为

    Question 对于可能在 x86 或 x86 x64 系统上触发意外行为的交叉修改代码有哪些想法 在这些系统中 交叉修改代码中的所有操作均已正确完成 但在执行处理器之前执行序列化指令除外修改代码 如下所述 我有一个 Core 2 Duo
  • C# 在 Process.Kill() 期间仅完成了 ReadProcessMemory 或 WriteProcessMemory 请求的一部分

    我一直在广泛研究这个问题 但似乎找不到答案 我知道Only part of a ReadProcessMemory or WriteProcessMemory request was completed当 32 位进程尝试访问 64 位进程
  • 无锁算法中的 ABA

    我明白了ABA http en wikipedia org wiki ABA problem问题 但我无法理解的是 他们说在语言中自动垃圾收集它可能不会展示 所以我的问题是 自动垃圾收集如何防止ABA问题的发生 在java中是否可能 如果可
  • Linux下的C#,Process.Start()异常“没有这样的文件或目录”

    我在使用 Process 类调用程序来启动程序时遇到问题 可执行文件的层次结构位于 bin 目录下 而当前工作目录需要位于 lib 目录下 project bin a out this is what I need to call lib
  • 编写潜在并发问题的证明

    我正在阅读 Java 并发实践 并尝试编写一段代码来表明第 3 5 1 章中作为示例提供的类确实会引入问题 public class Holder public int n public Holder int n this n n publ
  • 如何通过 SSL 从 Phoenix Web App 连接到 PostgreSQL?

    When trying to run Elixir Phoenix Web Application using PostgreSQL Database hosted 3rd party Database as a Service Azure
  • 独占锁定ConcurrentHashMap

    我知道不可能锁定 ConcurrentHashMap 进行独占访问 但是 我找不到原因 是因为构成CHM的 Segment 没有被api公开吗 据推测 如果是的话 客户端代码可以执行 交接 锁定 Cheers 我知道不可能锁定 Concur
  • 使用 SQL Server 作为具有多个客户端的数据库队列

    给定一个充当队列的表 如何最好地配置表 查询 以便多个客户端同时处理队列 例如 下表指示了工作人员必须处理的命令 当worker完成后 它会将处理后的值设置为true ID COMMAND PROCESSED 1 true 2 false

随机推荐

  • 在 R 中裁剪光栅

    我正在绘制美国东北部的地图 地图背景需要是海拔图或年平均温度图 我有来自 Worldclim org 的两个栅格 它们为我提供了这些变量 但我需要将它们裁剪到我感兴趣的状态范围 有关如何执行此操作的任何建议 这是我到目前为止所拥有的 loa
  • MySQL:索引可变长度的json数组?

    我想做一个tags类型列json e g id tags 1 tag1 tag2 tag3 2 tag1 tag3 tag5 tag7 3 tag2 tag5 我想为每个索引tag在数组中 不知道数组的长度 可变长度 那么如果我查询包含的行
  • 将大量数据从 NIST 更改为 RIFF wav 文件

    所以 我正在编写一个语音识别程序 为此 我从 TIMIT 下载了 400MB 的数据 当我打算读取 wav 文件时 我尝试了两个库 如下所示 import scipy io wavfile as wavfile import wave fs
  • 向客户展示应用程序的测试版

    我可以向客户发送可以在模拟器中运行的 iOS 应用程序的测试版吗 我可以在 Mac 上仅安装模拟器 不带 Xcode 吗 实际上 我需要一种有效的方法来向他发送应用程序的测试版 而不必在每次更新时与他见面 另外 3 有没有办法安装我在 iO
  • 当指定 -g 时,gcc 会定义什么吗?

    很快 我想知道 gcc 或 g 我需要它C 但也对 c 感到好奇 定义了任何特殊符号 如果 g已启用 可以 如果是的话 是什么符号 在搜索过程中我发现 DEBUG是手动定义的 手动我的意思是 D DEBUG 并且是 Visual C 程序员
  • 如何列出 docker 容器中包含的所有应用程序?

    我已经下载了一个 docker 容器 它使用几种不同类型的软件对输入文件执行多种不同的操作 即对齐 变体调用等 如何找出 docker 容器 图像的内容是什么 抱歉 如果这是微不足道的 我对 docker 完全陌生 有 至少 三种方式来解释
  • 错误:尝试在主机“localhost:27017”上运行命令“saslStart”时出现网络错误

    当我跑步时mongo我可以使用列出数据库show dbs命令 并执行写入和读取操作 但是当使用客户端 Robot 3T 时 我收到下一个错误 Error Network error while attempting to run comma
  • Python - 使用线程或队列迭代调用函数的 for 循环

    我对 python 相当陌生 正在制作一个脚本 允许将其他程序的点云数据引入 Autodesk Maya 我的脚本运行良好 但我想做的是让它更快 我有一个 for 循环 它遍历编号文件的列表 IE datafile001 txt dataf
  • 兑换代币代码 facebook-c#-sdk

    我正在使用 Facebook C Sdk v5 0 3 在 vb net 中创建一个非画布 Web 表单应用程序 但在将返回的 facebook 代码交换为 access token 时遇到问题 有人有我可以看的示例 C 或 vb net
  • 在 WooCommerce 管理新订单自定义字段中加载用户自定义数据

    灵感来自Woocommerce 可编辑自定义结帐字段和 get formatted shipping address https stackoverflow com questions 61522677 woocommerce editab
  • apache poi:如何创建带有条形图和折线图的图表?

    是否可以在 apache poi 中创建一个包含条形图和折线图的图表 你可以找个例子here https blogs office com en us 2012 06 21 combining chart types adding a se
  • 填充网络表单的最佳日历弹出窗口是什么?

    我希望能够在选择日期后进行 HTTP 调用来更新某些选择框 我希望能够控制更新文本框 以便我知道何时发生 真正的 更改 如果选择了相同的日期 理想情况下 我会调用一个函数来弹出日历 并能够在填充文本框之前评估日期 这样我就可以在进行服务器调
  • 将多个项目放在相对布局中居中而不将它们放入容器中?

    我有一个包含一对并排按钮的相对布局 我希望它们在布局中居中 我可以将按钮放在 LinearLayout 中并将其居中放在relativelayout 中 但我想保持 xml 尽可能干净 这是我尝试过的 这只是将 应用 按钮放在中间 将 撤消
  • 添加具有现有列名称的新列

    我正在处理一个数据框 如下所示 FID geometry Code w1 w2 0 12776 POLYGON 1 350000000000025 53 61540813717482 12776 0 1 1 13892 POLYGON 6
  • 在基本层面上,eval-parse 在 R 中做什么?

    我已经看到在循环或 apply 函数中使用 eval parse 的参考 但我仍然不清楚如何使用它 为了帮助像我这样的初学者理解它 有人可以解释为什么下面的第一部分 没有 eval parse 有效 而第二部分 有它 不起作用 这是 eva
  • Poetry能否根据对应C库的版本自动选择包版本

    我将使用 GDAL 作为具体示例 为了安装gdalPython 包 您必须先安装 GDAL C 库 您还必须安装 Python 版本gdal以匹配您安装的 C 库的版本 gdal config version 3 2 0 lt this i
  • 有没有办法让 WPF 应用程序尊重 Windows 10 中深色/浅色主题的系统选择?

    Windows 10最近添加了深色模式 有什么方法可以让我的 WPF 应用程序尊重此设置吗 最好是一个可以自动翻转它的开关 但如果没有 我想我可以在某处读取系统设置并切换到我的代码或其他东西中的备用主题 没有直接的 API 事件来检测 wp
  • # 符号的 HTML 字符实体是什么?

    符号的 HTML 字符实体是什么 我四处寻找 英镑 不断返回货币 哈希 和 数字 但我尝试的似乎没有变成正确的字符 您可以在以下位置搜索单个字符 文件格式信息 http www fileformat info info unicode ch
  • T-SQL:DROP 表级联约束等效吗?

    在 Oracle 中 我可以发出 DROP TABLE 级联约束 它不会抱怨 FK 等 T SQL 中有等效的吗 对于那些希望获得更普遍适用的答案的人 这将找到约束 删除它 然后删除列 感谢蒂姆 伦汀并投票如何查找默认约束的名称 https
  • Erlang 进程和消息传递架构

    我手头的任务是读取大文件的行 处理它们 并返回有序结果 我的算法是 从评估工作负载的主进程开始 写在文件的第一行 生成工作进程 每个工作进程将使用 pread 3 读取文件的一部分 处理这部分 并将结果发送给 master master接收