2017-07-17 1 views
0

Ich lese das Buch Python und HDF5 (O'Reilly), die einen Abschnitt über die leeren Datensätze hat und die Größe, die sie auf der Festplatte nehmen:Größe auf der Festplatte eines teilweise gefüllten HDF5 Dataset

import numpy as np 
import h5py 

f = h5py.File("testfile.hdf5") 
dset = f.create_dataset("big dataset", (1024**3,), dtype=np.float32) 
f.flush() 
# Size on disk is 1KB 

dset[0:1024] = np.arange(1024) 
f.flush() 
# Size on disk is 4GB 

Nach dem Ausfüllen des ersten Datensatzes (1024 Einträge) mit den Werten erwartete ich, dass die Datei wachsen würde, aber nicht auf 4 GB. Es ist im Wesentlichen die gleiche Größe wie wenn ich es tue:

dset[...] = np.arange(1024**3) 

Das Buch besagt, dass die Dateigröße auf der Festplatte sollte um 66KB sein. Könnte jemand erklären, was der Grund für die plötzliche Größenzunahme ist?

Version Info:

  • Python 3.6.1 (OSX)
  • h5py 2.7.0

Antwort

2

Wenn Sie Ihre Datei in HdfView öffnen können Sie das Chunking sehen ausgeschaltet ist. Dies bedeutet, dass das Array in einem zusammenhängenden Speicherblock in der Datei gespeichert wird und nicht in der Größe geändert werden kann. Somit müssen alle 4 GB in der Datei zugeordnet sein.

Wenn Sie Ihren Datensatz mit aktiviertem Chunking erstellen, wird der Datensatz in regelmäßig große Teile aufgeteilt, die zufällig auf der Festplatte gespeichert und mit einem B-Baum indiziert werden. In diesem Fall werden nur die Blöcke, die (mindestens ein Element von) Daten haben, auf der Platte zugeordnet. Wenn Sie Ihre Daten-Set wie folgt erstellen wird die Datei viel kleiner:

dset = f.create_dataset("big dataset", (1024**3,), dtype=np.float32, chunks=True) 

Die chunks=True automatisch h5py bestimmen die Größe der Stücke lässt. Sie können die Chunk-Größe auch explizit festlegen. Zum Beispiel ist es auf 16384 Schwimmer einzustellen (= 64 Kb), verwenden:

dset = f.create_dataset("big dataset", (1024**3,), dtype=np.float32, chunks=(2**14,)) 

Die beste Blockgröße hängt von den Lese- und Schreibmustern Ihrer Anwendungen. Beachten Sie Folgendes:

Chunking hat Auswirkungen auf die Leistung. Es wird empfohlen, die Gesamtgröße Ihrer Stücke zwischen 10 KiB und 1 MiB zu halten, größer für größere Datasets. Beachten Sie auch, dass beim Zugriff auf ein Element in einem Chunk der gesamte Chunk von der Festplatte gelesen wird.

Siehe http://docs.h5py.org/en/latest/high/dataset.html#chunked-storage

Verwandte Themen