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. 从7更新A[4,2]到6。
  3. 取一个稀疏向量v=[0,0,3.1,0,0]并将其乘以A并得到结果。

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

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

4

2 回答 2

1

您所知,Brian,ZeroMQ 不是这里的问题

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

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

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

  3. 对稀疏矩阵工具采取的极端谨慎也意味着,需要“传达”稀疏矩阵(重新)表示,而不是“发送”它(如果不仅仅是因为[SPACE]在发起者的节点,然后由于稀疏矩阵内容的很可能非常不同的表示)

可能解决方案的概念:

这就是说,我的选择是创建一个基于智能分布式代理的系统翻译,这将允许目标环境询问发起方(组装大规模稀疏矩阵的地方)开始重新表示大规模的过程稀疏矩阵到目标环境,其中这种“通过智能通信内容复制”将准备好用于此类内容重新表示类型的,即准备好{ Matrix | sparseMatrix }use LinearAlgebra;

只需忘记寻找迄今为止提供的任何低悬的果实,这[SPACE]将杀死任何 JSON-grown-in-size-re-wrapped-original-Massive-matrix,第一个几乎不适合相同的 Node in-RAM 占用空间和第二次甚至会崩溃,即使是零拷贝(因为这些数据的拷贝-Peta-BLOB 会试图放入 O/S 和内核网络缓冲区等)并且不会飞

于 2017-08-21T21:10:46.490 回答
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'

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

于 2017-08-28T20:27:41.367 回答