HDF5 - us4us
Transkrypt
HDF5 - us4us
JĘZYK PYTHON - NARZĘDZIE DLA KAŻDEGO NAUKOWCA Michał & Mateusz w zastępstwie za Marcin Lewandowski [ [email protected] ] WYJAŚNIENIE • Przepraszam Państwa, ale wyskoczyło mi ważne spotkanie i nie mogę dzisiaj poprowadzić wykładu. • Poprosiłem moich kolegów z ZU o zajęcie się Państwem. • Zgodnie z sugestią pogłębimy temat HDF5. Marcin Lewandowski 2 HDF5 3 HDF5 • Hierarchical Data Format (HDF, HDF4, HDF5 ) – określa format oraz zestaw bibliotek do zachowywania i manipulowania BARDZO DUŻYMI zestawami danych numerycznych • Oryginalnie opracowany w National Center for Supercomputing Applications, obecnie rozwijany i wspierany przez organizację non-profit The HDF Group (http://www.hdfgroup.com) • OTWARTY!!! 4 HDF5 cechy • Uniwersalny i hierarchiczny model danych pozwala na reprezentację złożonych struktur danych oraz metadanych (a’la system plikowy w pliku) • W pełni przenośny pomiędzy różnymi platformami • Obsługa plików > 2GB • OFICJALNE biblioteki dla: C, C++, Fortran 90, Java • INNE biblioteki: Matlab (7+), Perl, Python • Dostępne narzędzia do zarządzania, przeglądania, analizy i manipulacji 5 HDF5 struktura • HDF5 jest hierarchiczny – struktury: Groups & Datasets • Dodatkowo Attributes mogą być przypisane do danego Dataset • HDF5 Groups zawierają: – Strukturę grupującą 0 lub więcej Groups lub Datasets – Dodatkowe metadane • HDF5 Datasets zawiera: – Nagłówek danych – Tablicę danych 6 Structures to organize objects “Groups” “/” (root) 3-D array “/foo” lat | lon | temp ----|-----|----12 | 23 | 3.1 15 | 24 | 4.2 17 | 21 | 3.6 palette Table Raster image Raster image “Datasets” 2-D array 7 HDF5 Dataset • Klasy informacji w nagłówku Dataset: – Nazwa Datasetu – string ASCII – Typ danych: • Atomowe – np. integer, float • Złożone – struktury – Przestrzeń danych – określa liczbę wymiarów Datasetu (nielimitowana) – Układ Datasetu: • Ciągły (domyślny) • Blokowy – w równych „kawałkach” zapamiętywanych w różnych częściach pliku (w celu optymalizacji I/O) 8 HDF5 Dataset Metadata Data Dataspace Rank Dimensions 3 Datatype Dim_1 = 4 Dim_2 = 5 Dim_3 = 7 Integer (optional) Attributes Properties Time = 32.4 Chunked Pressure = 987 Compressed Temp = 56 Na podstawie:Introduction to HDF5 by Barbara Jones, The HDF Group, The 13th HDF & HDF-EOS Workshop, November 3-5, 2009 9 HDF5 typy danych 10 HDF5 Attributes • Attributes – „małe” nazwane Datasety związane z głównymi Datasets, Groups lub nazwanymi typami danych • Używane do opisu danych (metadane) • Attribute składają się z: – Nazwy – Wartości • Attributes są pamiętane w nagłówkach obiektów, których dotyczą 11 HDFView – przeglądarka HDF5 12 HDF5 i Matlab • Domyślny format plików MAT od wersji 7.3+ • Funkcje wysokiego poziomu – zapis/odczyt plików MAT (workspace) • Funkcje niskiego poziomu (300 funkcji) – bezpośredni dostęp do biblioteki C API Patrz: MATLAB 7 Programming Fundamentals 13 HDF5-Matlab funkcje wysokiego poziomu • hdf5info • hdf5read • hdf5write 14 hdf5info fileinfo = hdf5info(filename) fileinfo = hdf5info(...,'ReadAttributes',BOOL) [...] = hdf5info(..., 'V71Dimensions', BOOL) • Przykład: fileinfo = hdf5info('example.h5') fileinfo = Filename: 'example.h5' LibVersion: '1.8.3' Offset: 0 FileSize: 8172 GroupHierarchy: [1x1 struct] 15 hdf5read data = hdf5read(filename,datasetname) attr = hdf5read(filename,attributename) [data, attr] = hdf5read(...,'ReadAttributes',BOOL) data = hdf5read(hinfo) [...] = hdf5read(..., 'V71Dimensions', BOOL) 16 HDF5 i Python • h5py (http://h5py.googlecode.com) • NumPy (http://new.scipy.org) • Test: >>> import h5py.tests >>> h5py.tests.runtests() 17 EX: hdf5 Konwersja pliku tekstowego do HDF5 • Skrypt T2Hconverter.py służy do konwersji pliku tekstowego (TXT), z danymi przykładowymi, do formatu HDF5 • Jako wynik otrzymujemy plik HDF5 (H5) o nazwie identycznej z nazwą pliku danych T2Hconverter [nazwa pliku danych] 18 Tekstowe dane wejściowe ------- listing pliku dane.txt ----------------------------------------------; Przykładowy plik z danymi pomiarowymi. ; Średnik na początku linii oznacza komentarz ; Format danych: ; Czas [s] (float), Temperatura [st. C] (float) 0,25.6 5,27.3 10,29.1 15,30.7 20,31.2 25,34.5 30,42.2 35,37.5 40,32.0 45,27.6 50,25.3 55,25.1 60,25.0 -------- koniec listingu ------------------------------------------------------ 19 Struktura pliku wynikowego HDF5 /ROOT | |----Header | | | |- ConversionDate | | | |- Description | | | |- ScriptVersion (pomnożona x10) | |----Data | | | |- Values (float) czas, rząd 2 - temp ) (string) data i czas konwersji (string) opis pliku (int) wersja skryptu zapisu macierz danych ( rząd 1 - 20 Skrypty dla Matlaba • Skrypt "h5reader_example.m" odczytuje dane z pliku wejściowego w formacie HDF5 i wyświetla zawartość w oknie roboczym. • Nazwa pliku wejściowego znajduję się w zmiennej FILE_NAME deklarowanej na początku skryptu 21 H5PY KROK-PO-KROKU Na podstawie: http://h5py.alfven.org/docs/guide/quick.html 22 Pliki HDF5 • Konstruktor plików HDF5 akceptuje tryby analogicznie jak zwykła funkcja open(): – “r”, “w”, “a” (domyślny) # tworzy lub nadpisuje plik >>> f = h5py.File('file1.hdf5', 'w') # otwiera istniejący tylko do odczytu >>> f = h5py.File('file2.hdf5', 'r') 23 HDF5 Dataset • Utworzenie HDF5 z datasetem (100,100) typu integer • Inicjalizacja datasetu wartością 42 >>> import h5py # utworzenie HDF5 >>> f = h5py.File('myfile.hdf5') >>> dset=f.create_dataset("MyDataset", (100, 100), 'i') >>> dset[...] = 42 24 HDF5 Dataset c.d. • Własności dataset (utworzonego wcześniej) : >>> dset.shape (100, 100) >>> dset.dtype dtype('int32') • Dataset można utworzyć z array wbudowanego w NumPy: >>> import numpy >>> arr = numpy.ones((2,3), '=i4') >>> dset = f.create_dataset('AnotherDataset', data=arr) 25 Grupy • Utworzony Dataset ma nazwę, która tworzy element ścieżki dostępu do niego: >>> dset.name '/MyDataset' • Do złudzenia przypomina to system ścieżek w systemach plikowych. W powyższym przykładzie mówimy, że MyDataset znajduje się w Grupie root (/) pliku HDF5. • Można tworzyć inne grupy i podgrupy: >>> subgroup = f.create_group("SubGroup") >>> subgroup.name '/SubGroup' • Każda z nich może z kolei zawierać Datasety i/lub kolejne Grupy: >>> dset2 = subgroup.create_dataset('MyOtherDataset', (4,5), '=f8') >>> dset2.name '/SubGroup/MyOtherDataset' 26 Grupy c.d. • Dostęp do grup za pomocą ścieżki (z podgrupy lub ścieżka bezwzględna dla pliku): >>> dset2 = subgroup['MyOtherDataset'] >>> dset2 = f['/SubGroup/MyOtherDataset'] # equivalent • Grupy oraz obiekt plikowy HDF5 (”f” w tym przykładzie) wspierają inne operacje słownikowe: >>> list(f) ['MyDataset', 'SubGroup'] >>> 'MyDataset' in f True >>> 'Subgroup/MyOtherDataset' in f True >>> del f['MyDataset'] • As a safety feature, you can’t create an object with a pre-existing name; you have to manually delete the existing object first: >>> grp = f.create_group("NewGroup") >>> grp = f.create_group("NewGroup") ValueError: Name already exists (Symbol table: Object already exists) >>> del f['NewGroup'] >>> grp = f.create_group("NewGroup") 27 Atrybuty • • • HDF5 pozwala na dodawanie dodatkowych „małych” danych do Grup i Datasetów, są to Atrybuty. Atrybuty mają funkcję metadanych – czyli danych o danych, które mogą dodatkowo opisywać dane np. tytuł, timestamp, etc. Obiekt typu słownikowego (Dict) o nazwie attr jest związany z każdą Grupą/Datasetem i służy do dostępu do Atrybutów: >>> dset.attrs <Attributes of HDF5 object "MyDataset" (0)> >>> dset.attrs["Name"] = "My Dataset" >>> dset.attrs[„My Index"] = 4 >>> dset.attrs["Order Array"] = numpy.arange(10) >>> for name, value in dset.attrs.iteritems(): ... print name+":", value ... Name: My Dataset My Index: 4 Order Array: [0 1 2 3 4 5 6 7 8 9] 28 Dataset – funkcje specjalne • Datasety HDF5 wspierają specjalne funkcje za pomocą opcji przekazanych do Group.create_dataset(): • Chunked storage – struktura danych typu bloki indeksowane w Bdrzewo lub w sposób ciągły. Tego typu układ może drastycznie przyśpieszać operacje I/O dla pewnych wzorów dostępu do danych (np. co n-ty). • Compression – przezroczysta bezstratna kompresja danych; dostępne są typy kompresji “gzip”, “lzf”, “szip”. • Error-Detection – wszystkie pliki HDF5 zawierają sumę kontrolną (algorytm fletcher32), która umożliwia weryfikację zapisz/odczyt dla Datasetu. Błąd sumy kontrolne przy odczycie powoduje wyjątek! • Resizing – rozmiary Datasety HDF5 mogą być zmieniane „w locie” (do maksymalnego rozmiaru określonego w momencie tworzenia). 29 Dynamiczny resizing • Funkcja Dataset.resize() modyfikuje rozmiar datasetu (w miejscu): >>> dset = grp.create_dataset("name", (10,10), '=f8', maxshape=(None, None)) >>> dset.shape (10, 10) >>> dset.resize((20,20)) >>> dset.shape (20, 20) 30 Dostęp i „krojenie” Datasetu • Dosęp do Dataset za pomocą tradycyjnego ‚slicingu’ oraz rozszerzonego a’la NumPy. • Przecięcia (slices) są tłumaczone na odpowiednik HDF5 zwany hyperslab, który zapewnia szybki i efektywny dostęp do danych. • Rozpoznawane argumenty ‚slicingu’: – – – – Liczby: wszystko co jest konwertowalne do Python long Obiekty Slice – UWAGA: ujemne indeksy niedozwolone! Nazwy pól – dla danych złożonych (compound) Obiekt Ellipsis (...) – maksymalnie jeden! 31 Dostęp i „krojenie” Datasetu – przykłady >>> dset = f.create_dataset("MyDataset", (10,10,10), 'f') >>> dset[0,0,0] >>> dset[0,2:10,1:9:3] >>> dset[:,::2,5] >>> dset[0] >>> dset[1,5] >>> dset[0,...] >>> dset[...,6] • Dla danych złożonych można specyfikować wiele pól na raz: >>> dset["FieldA"] >>> dset[0,:,4:5, "FieldA", "FieldB"] >>> dset[0, ..., "FieldC"] 32 Broadcasting (rozgłaszanie) • Dla prostego ‚slicingu’ wspierane jest rozgłaszanie wartości: >>> dset[0,:,:] = np.arange(10) (10,10) # wypełnij • h5py NIE używa NumPy do realizacji rozgłaszania. Rozgłaszanie jest zaimplementowane za pomocą wielokrotnych selekcji z użyciem HDF5 hyperslab. • W tym przykładzie Dataset (1000, 1000) jest rozgłaszany do Datasetu (1000, 1000, 1000) : >>> dset2 = f.create_dataset("MyDataset", (1000,1000,1000), 'f') >>> data = numpy.arange(1000*1000, dtype='f').reshape((1000,1000)) >>> dset2[:] = data # To nie wymaga alokacji 3.8GB! • Broadcasting jest wspierany tylko dla prostego “slicningu”. 33 Zgodność z NumPy • Datasety implementują następujące funkcje interfejsu obsługi tablic w NumPy (tzw. NumPy-array): – Slicing – proste i elementy zaawansowanego indeksowania – shape – atrybut – dtype – atrybut UWAGA: do tego tematu wrócimy omawiając NumPy 34