Ich habe ein Problem mit der Berechnung des Mittelwerts eines Arrays in numpy, das für RAM (~ 100G) zu groß ist.Berechne den Mittelwert eines großen numpy-Arrays, das aus der hdf5-Datei memmapped ist
Ich habe in schaute np.memmap
verwenden, aber leider ist mein Array als Datensatz in einer hdf5-Datei gespeichert. Und basierend auf dem, was ich versucht habe, akzeptiert np.memmap keine hdf5-Datensätze als Eingabe.
TypeError: coercing to Unicode: need string or buffer, Dataset found
Wie kann ich anrufen np.mean
auf einem Memory-Mapped-Array von der Festplatte auf eine effiziente Art und Weise? Natürlich könnte ich Teile des Datensatzes durchlaufen, wo jeder Teil in den Speicher passt.
Allerdings fühlt sich das zu sehr wie ein Workaround an und ich bin mir auch nicht sicher, ob es die beste Leistung erzielen würde.
Hier ist ein Beispielcode:
data = np.randint(0, 255, 100000*10*10*10, dtype=np.uint8)
data.reshape((100000,10,10,10)) # typically lot larger, ~100G
hdf5_file = h5py.File('data.h5', 'w')
hdf5_file.create_dataset('x', data=data, dtype='uint8')
def get_mean_image(filepath):
"""
Returns the mean_array of a dataset.
"""
f = h5py.File(filepath, "r")
xs_mean = np.mean(f['x'], axis=0) # memory error with large enough array
return xs_mean
xs_mean = get_mean_image('./data.h5')
ich gehen würde, voraus eine der von der 'h5py'-Datensatz lesen chunked tun. Lass das funktionieren. Dann können Sie testen, ob die Iteration wirklich Zeit kostet. Bei großen Arrays können die Kosten für die Speicherverwaltung die Iterationskosten übersteigen. – hpaulj
Sie haben Recht, es kostet eigentlich nicht so viel. Der einzige Fehler ist die Schleife, die Sie programmieren müssen, also ist es nicht so elegant. Vielen Dank! – 0vbb