我有一个稀疏矩阵
A
(有多少故事以这种方式开始?)。
[
[0, 0, 0, 1.2, 0]
[0, 0, 0, 0, 0]
[3.5, 0, 0, 0, 0]
[0 7, 0, 0, 0]
]
我想使用 ZeroMQ 在进程之间来回发送此变体。 假设客户端和服务器使用不同的语言,没有通用的序列化格式。 这是一些任务。
A
。 由于需要发送矩阵的“帧”,这很复杂,在这里(4,5)
。A[4,2]
从 7 更新为 6。v=[0,0,3.1,0,0]
并将其乘以 A
并得到结果。我被告知发送字节流可能是最好的解决方案,但我找不到不同库之间和稀疏格式的任何示例。
我的默认设置是 Python、C++ 或 Chapel 配对(如果有人可以与他们交谈)。
由于设计非常简单,我决定使用带有预设分隔符的字符串表示形式。如果没有像 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'
只要我不必发送大量矩阵,它就可以工作。
正如你已经知道的那样,ZeroMQ 不是这里的问题。
让我们先尝试重新包装问题的表述:
教堂将获得
use ZMQ;
将提供的所有功能
从 ZeroMQ 的角度来看,不是发起者一方的 Python,而是 Chapel(或 C++,正如您上面提到的)目标环境将决定最佳的序列化策略提供者,因为 de-ser 显然必须在内部工作特定的目标语言实现(是的,ZeroMQ 将尽最大努力逐字节地承载所有必要的有效负载,因此这里没有任何危险,即使是
ZMQ
模块问题的当前状态,最近正在接受审查) ,但是 de-ser 决定,一旦数据进入(正如我在 ZeroMQ 的许多答案中所提到的那样,ZMQ 将要么传递完整的原始消息,要么根本不传递任何消息——这会立即停止,因为这是一个危险的 No-Go-)尝试立即移动整个大规模矩阵的策略......)。
对稀疏矩阵工具的极度谨慎也意味着,更需要“传达”稀疏矩阵(重新)表示,而不是“发送”它(如果不仅仅是因为没有可用空间)在发起者的节点上,那么由于稀疏矩阵内容的表示很可能非常不同)
这就是说,我的选择是创建一个基于智能分布式代理的系统翻译,这将允许目标环境询问发起者一方(组装大规模稀疏矩阵的地方)来启动重新表示的过程大规模稀疏矩阵到目标环境中,其中这种“通过智能通信内容进行复制”将为 Chapel 做好准备,以
{ Matrix | sparseMatrix }
类型的此类内容重新表示,为 use LinearAlgebra;
做好准备
只需忘记寻找迄今为止提供的任何容易实现的目标,该空间将杀死任何 JSON 增长的尺寸重新包装的原始大规模矩阵,1st 几乎无法容纳在同一节点上-RAM 占用空间和 2nd 接下来甚至会崩溃,即使是零复制(因为此类数据的副本 - Peta-BLOB 试图放入操作系统和内核网络缓冲区等)并且不会飞行。