首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >箭流端到端是免费的吗?

箭流端到端是免费的吗?
EN

Stack Overflow用户
提问于 2019-12-13 13:54:36
回答 1查看 300关注 0票数 1

我对箭流很困惑。描述Arrow的许多来源都只是转述了下面是

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

说箭是零拷贝工具。

然而,据我所知,这些段落

列式格式的序列化数据的基本单位是“记录批处理”。从语义上讲,记录批是一个有序的数组集合,称为其字段,每个数组具有相同的长度,但可能具有不同的数据类型。记录批处理的字段名和类型共同构成批处理的架构。 在本节中,我们定义了一种协议,用于将记录批序列化为二进制有效负载流,并从这些有效负载中重构记录批,而不需要内存复制。

IPC流格式的描述,我的理解有限,源、数据是序列化的,只有反序列化才是零拷贝.

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

对吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-13 23:44:43

就像你说的,箭在接收端总是零拷贝。

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

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

下面是实际的C++代码(撰写本文时),发送方将数据写入OutputStream,后者是接收方的代理

代码语言:javascript
运行
复制
  // 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是文件句柄,那么字节将被写入文件,等等。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59323967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档