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

Podobne dokumenty