Wie erstellt man eine Speicheransicht für einen nicht zusammenhängenden Speicherort?

8

Ich habe eine fragmentierte Struktur im Speicher und möchte sie als zusammenhängende Speicheransicht verwenden. Gibt es einen einfachen Weg dies zu tun oder sollte ich meine eigene Lösung implementieren?

Betrachten Sie beispielsweise ein Dateiformat, das aus Datensätzen besteht. Jeder Datensatz hat einen Header fester Länge, der die Länge des Inhalts des Datensatzes angibt. Eine logische Struktur höherer Ebene kann sich über mehrere Datensätze erstrecken. Es würde das Implementieren der Struktur auf höherer Ebene einfacher machen, wenn es seinen eigenen fragmentierten Speicherort als einfaches zusammenhängendes Array von Bytes sehen könnte.

Aktualisierung:

Es scheint, dass Python diesen 'segmentierten' Puffertyp intern unterstützt, zumindest basierend auf Dieser Teil der Dokumentation . Aber das ist nur die C-API.

Update2:

Soweit ich weiß, tut die referenzierte C-API - die sogenannten Puffer im alten Stil -, was ich brauche, aber sie ist in der neueren Version von Python (3.X) veraltet und nicht mehr verfügbar. Das neue Pufferprotokoll - spezifiziert in PEP 3118 - bietet eine neue Möglichkeit, Puffer darzustellen. Diese API ist in den meisten Anwendungsfällen (z. B. Anwendungsfälle, in denen der dargestellte Puffer nicht zusammenhängend ist) besser benutzbar, unterstützt jedoch nicht diese spezielle, bei der ein eindimensionales Array vollständig frei ausgelegt werden kann (mehrfach anders) Größe Chunks) im Speicher.

    
molnarg 13.12.2013, 11:23
quelle

1 Antwort

1

Erstens - ich gehe davon aus, dass Sie dies nur in reinem Python und nicht in einer c-Erweiterung versuchen. Ich gehe also davon aus, dass Sie die verschiedenen Datensätze, die Sie interessieren, in eine Reihe von Python-Objekten geladen haben. Ihr Problem ist, dass Sie die Struktur auf höherer Ebene sehen wollen, die über diese Objekte verteilt ist / p>

Also können Sie nicht einfach jeden Datensatz in einen Byte-Array-Typ laden? Sie können dann das Python-Slicing von Arrays verwenden, um ein neues Array zu erstellen, das nur die Daten für die Struktur auf hoher Ebene enthält. Sie haben dann ein einzelnes Byte-Array mit nur den Daten, an denen Sie interessiert sind, und können es ausdrucken manipuliere es so, wie du es willst.

So etwas wie:

%Vor%

Natürlich werden Sie immer noch wissen müssen, wo innerhalb der Datensätze Ihre High-Level-Struktur ist, die Arrays korrekt zu zerlegen, aber das müssten Sie sowieso wissen.

BEARBEITEN :

Hinweis: Wenn Sie ein Segment einer Liste aufnehmen, werden die Daten in der Liste nicht kopiert, sondern nur ein neuer Satz von Referenzen auf die Daten erstellt:

%Vor%

Änderungen an der Liste b ändern sich jedoch nicht, da b eine neue Liste ist. Damit die Änderungen automatisch in der ursprünglichen Liste geändert werden, müssen Sie ein komplizierteres Objekt erstellen, das die Listen in den ursprünglichen Datensätzen enthält, und sie so verbergen, dass Sie entscheiden können, welche Liste und welches Element einer Liste geändert werden soll oder anzeigen, wenn ein Benutzer die komplexe Struktur ändern / anzeigen möchte. So etwas wie:

%Vor%

Zugegeben, das ist nicht die einfache Art, Dinge zu tun, auf die Sie gehofft haben, aber es sollte tun, was Sie brauchen.

    
Tommy 22.12.2013, 13:08
quelle

Tags und Links