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

How to send sparse vectors and matrices over ZeroMQ?

我有一个稀疏矩阵 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。这很复杂,因为需要发送矩阵的 "frame",这里是 (4,5).
  2. A[4,2] 从 7 更新为 6。
  3. 取一个稀疏向量 v=[0,0,3.1,0,0] 并将其乘以 A 并得到结果。

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

我的默认设置是 Python、C++ 或 Chapel 配对,如果有人可以与之交谈的话。

作为 ,Brian,ZeroMQ 不是这里的问题

让我们先尝试重新包装问题公式:

  1. 将获得 use ZMQ; 将提供的所有功能

  2. 从 ZeroMQ 的角度来看,不是发起者一方 ,而是 (或 C++,因为你'上面提到过)目标环境将决定最佳序列化策略提供者的最佳选择,因为反序列化器显然必须在特定的目标语言实现中工作(是的,ZeroMQ 将尽最大努力承载所有必要的有效负载,逐字节,所以这里没有危险,即使 ZMQ-module 问题的当前状态,最近正在审查中),但是 de-ser 决定,一旦数据进来(就像已经输入我的许多 ZeroMQ 答案,ZMQ 要么提供完整的原始消息,要么根本不提供 none——这会立即停止作为尝试一次移动整个大规模矩阵的危险的不成功策略。 . ).

  3. 对稀疏矩阵工具的极度关注也意味着,"communicate" 稀疏矩阵(重新)表示比 "send"-it(如果不仅仅是因为在发起者的节点上不可用 [SPACE],那么由于稀疏矩阵内容的表示很可能非常不同)

可能解决方案的概念:

这就是说,我的选择是创建一个基于智能分布式代理的系统翻译,这将允许目标环境要求发起方(组装大量稀疏矩阵的地方)开始重新处理的过程- 将大量稀疏矩阵表示到目标环境中,其中 "replication-via-smart-communicated-content" 将为 准备 { Matrix | sparseMatrix } 类型的此类内容重新表示,即为 use LinearAlgebra;

只是忘了寻找目前提供的任何低垂的果实,[SPACE] 会杀死任何 JSON-grown-in-size-re-wrapped-original-Massive-matrix, 1st 几乎不适合同一节点的内存占用空间,而 2nd 接下来甚至会崩溃,即使是零拷贝(因为会有这样的数据-Peta-BLOB 试图放入 O/S 和内核网络缓冲区等)并且 不会飞 .

由于设计非常简单,我决定使用带有预设分隔符的字符串表示形式。如果没有像 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'

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