正如您所说,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
是文件句柄,则将字节写入文件等。