【问题标题】:How to send double[][] array data using Apache Thrift from/to Java and C++如何使用 Apache Thrift 从/向 Java 和 C++ 发送 double[][] 数组数据
【发布时间】:2015-03-31 16:00:16
【问题描述】:

我正在处理一个 HPC 项目。我的设计由 Java 和 C++ 大师和工人组成。我的基本实验是在java编写的master端生成一个9000x9000双元素矩阵,比如double[9000][9000],然后将其发送给一些用C++编写的客户端,进行计算并发送回master。我知道 Thrift 除了原始类型之外还支持列表、集合和容器。我可以执行以下步骤:

  1. 将矩阵转换为 master 列表
  2. 使用 Thrift 对其进行序列化
  3. 发送给工人
  4. 反序列化列表并转换为矩阵
  5. 进行计算并再次将结果转换为列表
  6. 序列化列表并发送回 java master
  7. 反序列化列表并转换为矩阵。

我认为这是一个漫长的旅程。有没有更好的方法来完成这项任务? 如何将矩阵表示为二进制?如果二进制表示是最好的选择,我怎样才能有效地从 double[][] 转换为二进制,反之亦然。

【问题讨论】:

    标签: java rpc thrift


    【解决方案1】:

    Thrift 允许嵌套容器,所以应该这样做:

    typedef list< list< double>>  Matrix
    
    service Nebukadnezar {
       void EnterTheMatrix( 1: Matrix matrix);
    }
    

    如果用thrift -gen java yourfile.thrift 调用这会给你

    public interface Iface {
        public void EnterTheMatrix(List<List<Double>> matrix) 
          throws org.apache.thrift.TException;
    }
    

    然而,最大的问题是,这是否是一个好主意。您将必须测试这是否满足您的需求,包括用于转换数据的时间和/或内存。

    如果矩阵稀疏,我建议只发送使用过的数据,如下所示:

    struct MatrixCell {
      1: i16 x
      2: i16 y
      3: double data
    }
    
    typedef list< MatrixCell>  SparseMatrix
    

    【讨论】:

    • 这实际上是我在问题中提出的解决方案。矩阵不是稀疏的。我可以使用Kryo 进行序列化。它非常快,可以轻松地将几乎任何东西变成字节数组。不幸的是,它仅适用于 java。如果有一些适用于 java 和 c++ 的有效序列化,我可以使用它进行序列化并使用 Thrift 进行跨语言通信。
    • (1) 试一试,看看它是否足够快等。如果它确实按计划工作,则无需投入更多宝贵的时间。 (2) 如果没有 - 好吧,如果有必要,您始终可以构建自己的二进制格式,为两端手工制作一个序列化程序。 IEEE 浮点数是标准化的,所以问题不大。注意不同的字节顺序。其他一切都很容易。然后将其作为binary 元素发送。如果它不是公共 API,您可以为所欲为。
    猜你喜欢
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 2014-11-02
    相关资源
    最近更新 更多