MemoryView
MemoryView bietet die Funktionen, um multidimensionale homogene Arrays mit Elementen fester Größe auf Speicher unter Erweiterungsbibliotheken zu teilen.
Haftungsausschluss
-
Diese Funktion ist noch experimentell. Die hier beschriebene Spezifikation kann sich in Zukunft ändern.
-
Dieses Dokument ist in Arbeit. Bitte beachten Sie den Hauptzweig von Ruby für die neueste Version dieses Dokuments.
Übersicht
Wir befassen uns manchmal mit bestimmten Arten von Objekten, die Arrays mit gleich typisierten Elementen fester Größe auf einem zusammenhängenden Speicherbereich als interne Darstellung haben. Numo::NArray in numo-narray und Magick::Image in rmagick sind typische Beispiele für solche Objekte. MemoryView spielt die Rolle der Drehscheibe, um die internen Daten solcher Objekte ohne Kopie zwischen solchen Bibliotheken zu teilen.
Das kopierfreie Teilen von Daten ist in einigen Bereichen wie Datenanalyse, maschinelles Lernen und Bildverarbeitung sehr wichtig. In diesen Bereichen müssen die Leute große Mengen von Daten im Speicher mit mehreren Bibliotheken bearbeiten. Wenn wir gezwungen sind, zum Austausch großer Daten zwischen Bibliotheken zu kopieren, muss ein großer Teil der Datenverarbeitungszeit mit dem Kopieren von Daten belegt sein. Sie können solche Zeitverschwendung vermeiden, indem Sie MemoryView verwenden.
MemoryView hat zwei Kategorien von APIs
-
Producer API
Klassen können ihren eigenen MemoryView-Eintrag registrieren, der es Objekten dieser Klassen ermöglicht, ihre MemoryView preiszugeben.
-
Consumer API
Die Consumer API ermöglicht es uns, die MemoryView eines Objekts zu erhalten und zu verwalten.
MemoryView-Struktur
Eine MemoryView-Struktur, rb_memory_view_t, wird verwendet, um die MemoryView von Objekten zu exportieren. Diese Struktur enthält die Referenz auf das Objekt, das der Besitzer der MemoryView ist, den Zeiger auf den Kopf des exportierten Speichers und die Metadaten, die die Struktur des Speichers beschreiben. Die Metadaten können multidimensionale Arrays mit Strides beschreiben.
Die Mitglieder der MemoryView-Struktur
Die MemoryView-Struktur besteht aus den folgenden Mitgliedern.
-
VALUE objDie Referenz auf das ursprüngliche Objekt, das den über MemoryView exportierten Speicher besitzt.
RubyVMverwaltet die Referenzzählung der MemoryView-exportierten Objekte, um sie vor der Garbage Collection zu schützen. Die Konsumenten müssen sich nicht darum kümmern, dieses Objekt vorGCzu schützen. -
void *dataDer Zeiger auf den Kopf des exportierten Speichers.
-
ssize_t byte_sizeDie Anzahl der Bytes im Speicher, auf den
datazeigt. -
bool readonlytruefür schreibgeschützten Speicher,falsefür beschreibbaren Speicher. -
const char *formatEine Zeichenkette zur Beschreibung des Formats eines Elements oder NULL für ein unverpacktes Byte.
-
ssize_t item_sizeDie Anzahl der Bytes in jedem Element.
-
const rb_memory_view_item_component_t *item_desc.componentsDas Array der Metadaten der Komponente in einem Element.
-
size_t item_desc.lengthDie Anzahl der Elemente in
item_desc.components. -
ssize_t ndimDie Anzahl der Dimensionen.
-
const ssize_t *shapeEin Array der Größe
ndim, das die Anzahl der Elemente in jeder Dimension angibt. Dies kannNULLsein, wennndim1 ist. -
const ssize_t *stridesEin Array der Größe
ndim, das die Anzahl der Bytes angibt, die übersprungen werden müssen, um zum nächsten Element in jeder Dimension zu gelangen. Dies kannNULLsein, wennndim1 ist. -
const ssize_t *sub_offsetsEin Array der Größe
ndim, das die Offsets in jeder Dimension angibt, wenn die MemoryView ein verschachteltes Array bereitstellt. Dies kannNULLsein, wenn die MemoryView ein flaches Array bereitstellt. -
void *private_dataDie privaten Daten, die der MemoryView-Anbieter intern verwendet. Dies kann
NULLsein, wenn keine privaten Daten benötigt werden.
MemoryView APIs
Für Konsumenten
-
bool rb_memory_view_available_p(VALUE obj)Gibt
truezurück, wennobjdie Bereitstellung einer MemoryView unterstützt. Gibt andernfallsfalsezurück.Wenn diese Funktion
truezurückgibt, bedeutet dies nicht, dass die Funktionrb_memory_view_geterfolgreich sein wird. -
bool rb_memory_view_get(VALUE obj, rb_memory_view_t *view, int flags)Wenn das gegebene
objdie Bereitstellung einer MemoryView unterstützt, die den gegebenenflagsentspricht, füllt diese Funktionviewmit den Informationen der MemoryView und gibttruezurück. In diesem Fall wird die Referenzzählung vonobjerhöht.Wenn die gegebene Kombination von
objundflagskeine MemoryView bereitstellen kann, gibt diese Funktionfalsezurück. Der Inhalt vonviewwird in diesem Fall nicht berührt.Die bereitgestellte MemoryView muss mit
rb_memory_view_releasefreigegeben werden, wenn die MemoryView nicht mehr benötigt wird. -
bool rb_memory_view_release(rb_memory_view_t *view)Gibt die gegebene MemoryView
viewfrei und dekrementiert die Referenzzählung vonview->obj.Konsumenten müssen diese Funktion aufrufen, wenn die MemoryView nicht mehr benötigt wird. Das Nichtaufrufen dieser Funktion führt zu Speicherlecks.
-
ssize_t rb_memory_view_item_size_from_format(const char *format, const char **err)Berechnet die Anzahl der Bytes, die ein Element belegt.
Wenn die Berechnung fehlschlägt, wird die fehlerhafte Position in
formatinerrgespeichert und-1zurückgegeben. -
void *rb_memory_view_get_item_pointer(rb_memory_view_t *view, const ssize_t *indices)Berechnet die Position des durch die gegebenen
indicesangegebenen Elements. Die Länge vonindicesmuss gleichview->ndimsein. Diese Funktion initialisiertview->item_descbei Bedarf. -
VALUE rb_memory_view_get_item(rb_memory_view_t *view, const ssize_t *indices)Gibt die Ruby-Objektrepräsentation des durch die gegebenen
indicesangegebenen Elements zurück. Die Länge vonindicesmuss gleichview->ndimsein. Diese Funktion verwendetrb_memory_view_get_item_pointer. -
rb_memory_view_init_as_byte_array(rb_memory_view_t *view, VALUE obj, void *data, const ssize_t len, const bool readonly)
Füllt die Mitglieder von view als 1-dimensionales Byte-Array.
-
void rb_memory_view_fill_contiguous_strides(const ssize_t ndim, const ssize_t item_size, const ssize_t *const shape, const bool row_major_p, ssize_t *const strides)
Füllt das Array strides mit den Byte-Strides eines zusammenhängenden Arrays mit der gegebenen Form und Elementgröße.
-
void rb_memory_view_prepare_item_desc(rb_memory_view_t *view)
Füllt das Mitglied item_desc von view.
-
bool rb_memory_view_is_contiguous(const rb_memory_view_t *view)
Gibt true zurück, wenn die Daten in der MemoryView view zeilenweise oder spaltenweise zusammenhängend sind.
Gibt andernfalls false zurück.
-
bool rb_memory_view_is_row_major_contiguous(const rb_memory_view_t *view)
Gibt true zurück, wenn die Daten in der MemoryView view zeilenweise zusammenhängend sind.
Gibt andernfalls false zurück.
-
bool rb_memory_view_is_column_major_contiguous(const rb_memory_view_t *view)
Gibt true zurück, wenn die Daten in der MemoryView view spaltenweise zusammenhängend sind.
Gibt andernfalls false zurück.