2017-03-27 5 views
0

Ich habe eine große Sequenz (1000000) von kleinen Matrizen (32x32) in einer hdf5-Datei gespeichert, jede mit einem Label. Jede dieser Matrizen repräsentiert eine Sensordaten für eine bestimmte Zeit.hdf5 Matrix Lesen mit Python

Ich möchte die Entwicklung für jedes Pixel für eine kleine Zeitscheibe erhalten, die für jede x, y-Position in der Matrix unterschiedlich ist.

Dies dauert mehr Zeit als ich erwarte.

def getPixelSlice (self,xpixel,ypixel,initphoto,endphoto): 

     #obtain h5 keys inside time range between initphoto and endphoto 
     valid=np.where(np.logical_and(self.photoList>=initphoto,self.photoList<endphoto)) 

     #look at pixel data in valid frames 
     evolution = [] 

     #for each valid frame, obtain the data, and append the target pixel to the list. 
     for frame in valid[0]: 
      data = self.h5f[str(self.photoList[frame])]   
      evolution.append(data[ypixel][xpixel]) 

     return evolution,valid 

Antwort

0

So gibt es hier ein Problem, das mir eine Weile gedauert, für eine ähnliche Anwendung aussortieren. Aufgrund der physikalischen Einschränkungen von Festplatten werden die Daten so gespeichert, dass es bei einem dreidimensionalen Array immer einfacher ist, in einer Ausrichtung zu lesen. Alles hängt davon ab, in welcher Reihenfolge Sie die Daten gespeichert haben.

Wie Sie mit diesem Problem umgehen, hängt von Ihrer Anwendung ab. Meine spezifische Anwendung kann als "wenig schreiben, viele lesen" charakterisiert werden. In diesem Fall ist es am sinnvollsten, die Daten in der Reihenfolge zu speichern, in der ich sie erwarte. Um dies zu tun, verwende ich PyTables und spezifiziere einen "Chunkshape", der mit einer meiner Zeitreihen übereinstimmt. Also, in Ihrem Fall wäre es (1,1,1000000). Ich bin mir nicht sicher, ob diese Größe zu groß ist oder nicht, also musst du sie vielleicht etwas weiter abbrechen, sagen wir (1,1,10000) oder so ähnlich.

For more info see PyTables Optimization Tips.

Für Anwendungen, bei denen man oft in einer bestimmten Orientierung lesen möchten, ist es entscheidend, dass Sie eine geeignete Futter Form für Ihre HDF5 Arrays wählen.

Verwandte Themen