1

我对 Arrow Streaming 感到困惑。许多描述箭头的来源只是解释 以下内容

Arrow 内存格式支持零拷贝读取

并说 Arrow 是零拷贝工具。

但是,据我了解这些段落

列格式序列化数据的原始单位是“记录批”。从语义上讲,记录批次是数组的有序集合,称为字段,每个字段的长度相同,但数据类型可能不同。记录批次的字段名称和类型共同构成批次的架构。

在本节中,我们定义了一个协议,用于将记录批次序列化为二进制有效负载流,并从这些有效负载重构记录批次,而无需内存复制。

IPC Streaming Format的描述,以及我有限的理解,源,数据是序列化的,只有反序列化是零拷贝。

换句话说 - 使用 Arrow Streaming 的系统实际上是在途中复制数据。

那是对的吗?

4

1 回答 1

2

正如您所说,Arrow 在接收方始终是零拷贝。

使用 Arrow Streaming 的系统实际上会在途中复制数据。

这取决于您所说的“复制”是什么意思。数据是否在同一进程中在内存中重复?不。字节必须以某种方式从一个虚拟地址空间传输到另一个,无论您是否认为在技术上构成“副本”取决于您的应用程序(也许还有观点)。

这是实际的 C++ 代码(在撰写本文时),其中发送方将数据写入作为接收方OutputStream代理的

  // Now write the buffers
  for (size_t i = 0; i < payload.body_buffers.size(); ++i) {
    const std::shared_ptr<Buffer>& buffer = payload.body_buffers[i];
    int64_t size = 0;
    int64_t padding = 0;

    // The buffer might be null if we are handling zero row lengths.
    if (buffer) {
      size = buffer->size();
      padding = BitUtil::RoundUpToMultipleOf8(size) - size;
    }

    if (size > 0) {
      RETURN_NOT_OK(dst->Write(buffer));
    }

    if (padding > 0) {
      RETURN_NOT_OK(dst->Write(kPaddingBytes, padding));
    }
  }

这里没有任何东西被强行复制。如果dst站在类似套接字的接口前面,则字节立即通过电线传输到接收器(或缓冲,或任何OutputStream正在做的事情)。如果dst是文件句柄,则将字节写入文件等。

于 2019-12-13T23:44:43.453 回答