Ist es möglich, diskontinuierliche Daten auf der Festplatte einem Array mit Python zuzuordnen?

8

Ich möchte einen großen Fortran-Record (12G) auf der Festplatte in ein numpliges Array mappen. (Mapping statt Laden zum Speichern von Speicher.)

Die in fortran-Datensatz gespeicherten Daten sind nicht kontinuierlich, da sie durch Aufzeichnungsmarker dividiert werden. Die Datensatzstruktur ist als "Marker, Daten, Marker, Daten, ..., Daten, Marker". Die Länge von Datenbereichen und Markern ist bekannt.

Die Länge der Daten zwischen den Markern ist kein Vielfaches von 4 Bytes, sonst kann ich jede Datenregion einem Array zuordnen.

Der erste Marker kann übersprungen werden, indem in memmap ein Offset gesetzt wird. Ist es möglich, andere Marker zu überspringen und die Daten einem Array zuzuordnen?

Entschuldigung für mögliche mehrdeutige Ausdruck und Dank für jede Lösung oder Anregung.

Bearbeitet am 15. Mai

Dies sind Fortran unformatierte Dateien. Die im Datensatz gespeicherten Daten sind ein (1024 ^ 3) * 3 Float32-Array (12 GB).

Das Datensatzlayout von Datensätzen mit variabler Länge, die größer als 2 Gigabyte sind, wird unten gezeigt:

(Einzelheiten finden Sie unter hier -> Abschnitt [Record Types] -> Datensätze mit variabler Länge.

In meinem Fall, außer dem letzten, hat jeder Untersatz eine Länge von 2147483639 Bytes und ist durch 8 Bytes getrennt (wie Sie in der obigen Abbildung sehen, eine Endmarkierung des vorherigen Untersatzes und eine Anfangsmarkierung des folgenden, Insgesamt 8 Bytes).

Wir können sehen, dass der erste Teilsatz mit den ersten 3 Bytes einer bestimmten Gleitkommazahl endet und der zweite Teilsatz mit dem Rest 1 Byte beginnt, wie 2147483639 mod 4 = 3.

    
Syrtis Major 13.05.2013, 05:37
quelle

1 Antwort

3

Ich habe eine andere Antwort gepostet, weil für das hier angegebene Beispiel numpy.memmap funktioniert:

%Vor%

für int32 byte_size=32/8 , für int16 byte_size=16/8 und so weiter ...

Wenn die Größen konstant sind, können Sie die Daten in ein 2D-Array wie:

laden %Vor%

Sie können das Objekt memmap so lange ändern, wie Sie möchten. Es ist sogar möglich, Arrays mit denselben Elementen zu erstellen. In diesem Fall werden die Änderungen in der einen automatisch in der anderen aktualisiert.

Andere Referenzen:

Saullo Castro 16.05.2013, 21:20
quelle

Tags und Links