Arrow Streaming 是否端到端无复制

Is Arrow Streaming end-to-end copy-free

我对 Arrow Streaming 感到困惑。许多描述 Arrow 的消息来源只是解释 following

The Arrow memory format supports zero-copy reads

并说 Arrow 是零复制工具。

不过据我了解these paragraphs:

The primitive unit of serialized data in the columnar format is the “record batch”. Semantically, a record batch is an ordered collection of arrays, known as its fields, each having the same length as one another but potentially different data types. A record batch’s field names and types collectively form the batch’s schema.

In this section we define a protocol for serializing record batches into a stream of binary payloads and reconstructing record batches from these payloads without need for memory copying.

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

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

对吗?

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

systems that use Arrow Streaming actually copy the data on the way.

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

这是实际的 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 是文件句柄,则将字节写入文件,等等。