博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Apache Arrow官方文档-IPC进程间通信
阅读量:6412 次
发布时间:2019-06-23

本文共 2237 字,大约阅读时间需要 7 分钟。

封装消息格式

  流和文件格式中的数据组件表示为封装 消息,包括:

  • 指示元数据大小的长度前缀
  • 消息元数据作为Flatbuffer 平铺缓冲区
  • 将字节填充到8字节边界
  • 消息体
    示意,我们有:

 所述metadata_size包括flatbuffer加填充的大小。所述 Message flatbuffer包括版本号,特定消息(作为flatbuffer联合),和消息体的大小:

table Message {  version: org.apache.arrow.flatbuf.MetadataVersion;  header: MessageHeader;  bodyLength: long;}

  目前,我们支持4种类型的消息:

  • Schema
  • RecordBatch
  • DictionaryBatch
  • Tensor

流式格式

  我们提供用于RecordBatch的流格式。它被作为封装消息的序列呈现,每个消息遵循上述格式。该模式首先在流中,对于以后的所有RecordBatch都是相同的。如果模式中的任何字段都是字典编码的,则一个或多个 DictionaryBatch消息将跟随模式。

...
...

  当流读取器实现读取流时,在每个消息之后,它可以读取接下来的4个字节以知道以下消息元数据的大小。读取消息flatbuffer后,您可以读取消息体。

  流写入器可以通过写入0长度作为int32或简单地关闭流接口来发送流终端(EOS)信号。

文件格式

  我们以与流格式非常相似的格式定义支持随机访问的“文件格式”。该文件以魔术字符串ARROW1 (加上填充)开始和结束。文件中的内容与流格式相同。在文件末尾,我们编写一个页脚,包括文件中每个数据块的偏移量和大小,以便随机访问是可以实现的。有关文件页脚的精确细节,请参阅 format / File.fbs。

示意, 我们有:

RecordBatch体结构

所述RecordBatch元数据包含一个深度优先(先序)扁平化设置字段的元数据和物理内存缓冲区(Message.fbs 中的一些注释已经缩短/移除):

table RecordBatch {  length: long;  nodes: [FieldNode];  buffers: [Buffer];}struct FieldNode {  length: long;  null_count: long;}struct Buffer {  /// The shared memory page id where this buffer is located. Currently this is  /// not used  page: int;  /// The relative offset into the shared memory page where the bytes for this  /// buffer starts  offset: long;  /// The absolute length (in bytes) of the memory buffer. The memory is found  /// from offset (inclusive) to offset + length (non-inclusive).  length: long;}

  在文件的上下文中,不使用page,Buffer偏移量用作消息正文开头的参考帧。因此,在通用IPC设置中,这些偏移量可能是一个或多个共享内存区域中的任何位置,在文件格式中偏移量从0开始。

  RecordBatch的位置以及元数据块的大小以及缓冲区的大小存储在文件页脚中:

struct Block {  offset: long;  metaDataLength: int;  bodyLength: long;}

  一些关于这个的注释

  • 该Block偏移量表示记录批次的起始字节。
  • 元数据长度包括平缓缓冲区大小,记录批量元数据平缓缓冲区以及任何填充字节

    字典Batches

      字典Batch尚未实现,但它们在元数据中提供。目前,文件中显示的DICTIONARY细分片段不会出现在任何文件实现中。

    Tensor(多维数组)信息格式

      Tensor消息类型提供一种方式来编写使用Arrow的共享内存工具的固定大小的值(如一个NumPy的ndarray)的多维数组。尽管我们在C ++中提供了一个参考实现,但通常不需要实现这种数据格式的Arrow实现。

      当编写独立封装的Tensor消息时,我们使用上述格式,但另外将起始偏移(如果写入共享内存区域)对齐为8的倍数:

转载于:https://blog.51cto.com/1196740/2160821

你可能感兴趣的文章
Redis 哨兵Sentinel 高可用(学习笔记九)
查看>>
mybatis关于Criteria的用法小坑
查看>>
报考排队1小时?平安科技说只需90秒
查看>>
T-SQL学习中--窗口函数
查看>>
浅谈web开发
查看>>
Go 语言从新手到大神:每个人都会踩的五十个坑 (13-22)
查看>>
Android——Matrix变换矩阵的探索(1)
查看>>
04.构造函数 析构函数 拷贝函数
查看>>
到目前为止,生活教会给你最重要的一件事是什么?
查看>>
重拾Java(2)-运算符
查看>>
Linux系统诊断小技巧(15):启停问题之如何修复文件系统损坏
查看>>
Go语言基础语法-4
查看>>
使用Spring Boot 发送邮件(持续更新...)
查看>>
CentOS 7 安装Node
查看>>
初探性能优化--2个月到4小时的性能提升!
查看>>
Java NIO(七)Selector
查看>>
Hive操作大全(原创)
查看>>
区块链开发公司谈供应链金融的优势
查看>>
Android实际开发中实用的第三方(开源)框架
查看>>
Why I quit from Qt5 Quick?
查看>>