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
是文件句柄,则将字节写入文件,等等。
我对 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
是文件句柄,则将字节写入文件,等等。