如何通过ZeroMQ发送稀疏向量和矩阵?

问题描述 投票:0回答:2

我有一个稀疏矩阵

A
(有多少故事以这种方式开始?)。

[
[0,   0, 0, 1.2, 0]
[0,   0, 0, 0,   0]
[3.5, 0, 0, 0,   0]
[0    7, 0, 0,   0]
]

我想使用 ZeroMQ 在进程之间来回发送此变体。 假设客户端和服务器使用不同的语言,没有通用的序列化格式。 这是一些任务。

  1. 创建
    A
    。 由于需要发送矩阵的“帧”,这很复杂,在这里
    (4,5)
  2. A[4,2]
    从 7 更新为 6。
  3. 取一个稀疏向量
    v=[0,0,3.1,0,0]
    并将其乘以
    A
    并得到结果。

我被告知发送字节流可能是最好的解决方案,但我找不到不同库之间和稀疏格式的任何示例。

我的默认设置是 Python、C++ 或 Chapel 配对(如果有人可以与他们交谈)。

matrix sparse-matrix zeromq chapel
2个回答
1
投票

由于设计非常简单,我决定使用带有预设分隔符的字符串表示形式。如果没有像 protobuf 这样的东西,很容易就有一个可以理解的协议。 我使用的格式:

msg = '<i_index>:<j_index>:<value>^<i_index>:<j_index>:<value>`

就我而言,服务器已经知道矩阵的框架。所以要发送矢量

[0 0 0.8 0 0 1.4 0 0]
我会这样做

msg = '0:2:0.8^0:5:1.4'

只要我不必发送大量矩阵,它就可以工作。


1
投票

正如你已经知道的那样,ZeroMQ 不是这里的问题。

让我们先尝试重新包装问题的表述:

  1. 教堂将获得

    use ZMQ;
    将提供的所有功能

  2. 从 ZeroMQ 的角度来看,不是发起者一方的 Python,而是 Chapel(或 C++,正如您上面提到的)目标环境将决定最佳的序列化策略提供者,因为 de-ser 显然必须在内部工作特定的目标语言实现(是的,ZeroMQ 将尽最大努力逐字节地承载所有必要的有效负载,因此这里没有任何危险,即使是

    ZMQ
    模块问题的当前状态,最近正在接受审查) ,但是 de-ser 决定,一旦数据进入(正如我在 ZeroMQ 的许多答案中所提到的那样,ZMQ 将要么传递完整的原始消息,要么根本不传递任何消息——这会立即停止,因为这是一个危险的 No-Go-)尝试立即移动整个大规模矩阵的策略......)。

  3. 对稀疏矩阵工具的极度谨慎也意味着,更需要“传达”稀疏矩阵(重新)表示,而不是“发送”它(如果不仅仅是因为没有可用空间)在发起者的节点上,那么由于稀疏矩阵内容的表示很可能非常不同)

可能解决方案的概念

这就是说,我的选择是创建一个基于智能分布式代理的系统翻译,这将允许目标环境询问发起者一方(组装大规模稀疏矩阵的地方)来启动重新表示的过程大规模稀疏矩阵到目标环境中,其中这种“通过智能通信内容进行复制”将为 Chapel 做好准备,以

{ Matrix | sparseMatrix }
类型的此类内容重新表示,为
use LinearAlgebra;

做好准备

只需忘记寻找迄今为止提供的任何容易实现的目标,该空间将杀死任何 JSON 增长的尺寸重新包装的原始大规模矩阵,1st 几乎无法容纳在同一节点上-RAM 占用空间和 2nd 接下来甚至会崩溃,即使是零复制(因为此类数据的副本 - Peta-BLOB 试图放入操作系统和内核网络缓冲区等)并且不会飞行。

© www.soinside.com 2019 - 2024. All rights reserved.