2013-01-15 12 views
6

Piszę dużą liczbę małych zestawów danych do pliku HDF5, a wynikowy rozmiar pliku wynosi około 10x, czego oczekiwałbym od naiwnej tabeli danych, które wprowadzam. Moje dane są uporządkowane hierarchicznie w następujący sposób:Napięcie pamięci masowej HDF5

group 0 
    -> subgroup 0 
     -> dataset (dimensions: 100 x 4, datatype: float) 
     -> dataset (dimensions: 100, datatype: float) 
    -> subgroup 1 
     -> dataset (dimensions: 100 x 4, datatype: float) 
     -> dataset (dimensions: 100, datatype: float) 
    ... 
group 1 
... 

Każda podgrupa powinna zająć 500 * 4 Bytes = 2000 Bytes, ignorując obciążenie. Nie przechowuję żadnych atrybutów obok danych. Jednak podczas testów okazało się, że każda podgrupa zajmuje około 4 kB, czyli około dwa razy więcej niż oczekiwałbym. Rozumiem, że istnieje pewne obciążenie, ale skąd ono pochodzi i jak mogę je zmniejszyć? Czy reprezentuje strukturę grupy?

Więcej informacji: Jeśli zwiększenie rozmiarów dwóch zestawów danych w każdej podgrupie 1000 x 4 do 1000, a każda podgrupa zajmuje około 22250 bajtów, a nie płaskich 20000 bajtów, że oczekiwać. Oznacza to obciążenie 2,2 kB na podgrupę i jest zgodne z wynikami uzyskiwanymi przy mniejszych rozmiarach zbioru danych. Czy istnieje sposób na zmniejszenie tego obciążenia?

+3

Format pliku HDF5 jest [bardzo złożony] (http://www.hdfgroup.org/HDF5/doc/H5.format.html). Używa wewnętrznego blokowania do przechowywania danych i obiektów metadanych. Domyślny rozmiar bloku dla metadanych wynosi 2 KiB, a każda (pod) grupa ma swoją własną przestrzeń nagłówkową, która wyjaśnia zaobserwowaną różnicę około 2000 bajtów. Możesz spróbować eksperymentować z pamięcią typu "COMPACT" - patrz (4.5) [tutaj] (http://www.hdfgroup.org/HDF5/doc1.6/UG/10_Datasets.html), aby uzyskać więcej informacji na temat strategii przechowywania. –

+2

Numery, które podałem powyżej, są ustawione na "COMPACT". Lekcja z tego polega na unikaniu skomplikowanych struktur grupowych zawierających niewielkie ilości danych. Po połączeniu wszystkich moich zbiorów danych w większą macierz i zastosowaniu kompresji uzyskuje się lepszą niż 1: 1 wartość współczynnika wypełnienia (kompresja oszczędza więcej miejsca niż narzut na HDF5). – Thucydides411

+0

@ Thucydides411 Twój komentarz jest najlepszą odpowiedzią! Powinieneś zapisać go w odpowiedzi i zaakceptować. – Simon

Odpowiedz

4

Odpowiem na moje własne pytanie. Obciążenie związane z reprezentacją struktury grupy wystarczy, aby nie było sensu przechowywać małych tablic lub mieć wiele grup, z których każda zawiera tylko niewielką ilość danych. Wydaje się, że nie ma żadnego sposobu na zmniejszenie narzutu na grupę, który mierzyłem przy około 2,2 kB.

Rozwiązałem ten problem, łącząc dwa zestawy danych w każdej podgrupie w zestaw danych (100 x 5). Następnie wyeliminowałem podgrupy i połączyłem wszystkie zestawy danych w każdej grupie w zestaw danych 3D. Tak więc, jeśli wcześniej miałem podgrupy N, teraz mam jeden zbiór danych w każdej grupie, o kształcie (N x 100 x 5). W ten sposób oszczędzam narzut N * 2,2 kB, który był wcześniej obecny. Co więcej, ponieważ wbudowana kompresja HDF5 jest bardziej efektywna w przypadku większych macierzy, teraz mam lepszy ogólny współczynnik pakowania 1: 1, podczas gdy wcześniej, narzut pochłaniał połowę objętości pliku, a kompresja była całkowicie nieskuteczna.

Lekcja polega na unikaniu skomplikowanych struktur grupowych w plikach HDF5 i próbie połączenia jak największej ilości danych w każdym zbiorze danych.

+1

Tak ... i nie. HDF5 został stworzony przez naukowców do przechowywania ogromnych zbiorów danych. Myślę, że obsesją na punkcie ponad 2 kilobajtów jest chybianie punktu. Jeśli jesteś ograniczony przestrzenią, prawdopodobnie jest to dla ciebie niewłaściwa biblioteka. ZAWSZE warto próbować uczynić dane tak, jak to tylko możliwe, nawet jeśli zajmuje to kilka Kb. Możesz tworzyć "sprytne" struktury danych, tak samo jak możesz pisać "sprytny" kod, ale prawo Moore'a jest po stronie ludzi, którzy piszą możliwy do utrzymania kod i samopisujące struktury danych. –

+0

Myślę, że przejąłem to w mojej odpowiedzi. 2kB na zbiór danych jest z pewnością problemem, jeśli przechowujesz dużą liczbę małych zestawów danych. Moja odpowiedź, powyżej, to spakować dane do większych zestawów danych, jeśli to możliwe. Nie zaproponowałem skomplikowanej struktury: zbiór danych 3D, w którym każda oś ma znaczenie, jest dość prosty. – Thucydides411

Powiązane problemy