MemoryView

MemoryView 提供了在扩展库之间共享内存中固定大小元素的同构多维数组的功能。

免责声明

概述

我们有时会处理某些类型的对象,这些对象在连续的内存区域上具有相同类型固定大小元素的数组作为其内部表示。numo-narray 中的 Numo::NArray 和 rmagick 中的 Magick::Image 就是此类对象的典型示例。MemoryView 充当中心,在这些库之间共享此类对象的内部数据,无需复制。

在某些领域(如数据分析、机器学习和图像处理)中,无复制的数据共享非常重要。在这些领域,人们需要使用多个库处理大量的内存数据。如果我们被迫复制来在库之间交换大量数据,那么大量的数据处理时间必须被复制数据所占用。通过使用 MemoryView,您可以避免这种时间浪费。

MemoryView 有两个类别的 API

  1. 生产者 API

    类可以注册自己的 MemoryView 条目,这允许该类的对象公开其 MemoryView

  2. 消费者 API

    消费者 API 允许我们获取和管理对象的 MemoryView

MemoryView 结构

MemoryView 结构 rb_memory_view_t 用于导出对象的 MemoryView。此结构包含对象的引用(即 MemoryView 的所有者)、指向导出内存头部的指针以及描述内存结构的元数据。元数据可以描述带步幅的多维数组。

MemoryView 结构的成员

MemoryView 结构由以下成员组成。

MemoryView API

对于使用者

view 的成员填充为 1 维字节数组。

使用具有给定元素大小的给定形状的连续数组的字节步幅填充 strides 数组。

填充 viewitem_desc 成员。

如果 MemoryView view 中的数据是行主序或列主序连续的,则返回 true

否则返回 false

如果 MemoryView view 中的数据是行主序连续的,则返回 true

否则返回 false

如果 MemoryView view 中的数据是列主序连续的,则返回 true

否则返回 false