发布于 2019-12-13 23:44:43
就像你说的,箭在接收端总是零拷贝。
使用Arrow流的系统实际上是在途中复制数据。
这取决于你所说的“复制”是什么意思。数据是否在同一进程中被复制在内存中?不是的。字节必须以某种方式从一个虚拟地址空间传输到另一个虚拟地址空间,无论您是否认为在技术上构成一个“副本”取决于您的应用程序(也许也取决于您的观点)。
下面是实际的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
是文件句柄,那么字节将被写入文件,等等。
https://stackoverflow.com/questions/59323967
复制相似问题