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 的成员初始化为一维字节数组。

使用给定形状和元素大小的连续数组的字节跨度填充 strides 数组。

填充 viewitem_desc 成员。

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

否则返回 false

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

否则返回 false

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

否则返回 false