2009-07-14 10 views
14

Mam plik HDF5 z jednowymiarowym (N x 1) zbiorem danych złożonych elementów - w rzeczywistości jest to szereg czasowy. Dane są najpierw zbierane w trybie offline do pliku HFD5, a następnie analizowane. Podczas analizy większość danych okazuje się nieinteresująca, a tylko niektóre jej części są interesujące. Ponieważ zbiory danych mogą być dość duże, chciałbym pozbyć się nieinteresujących elementów, zachowując jednocześnie interesujące. Na przykład zachowaj elementy 0-100 i 200-300 i 350-400 z 500-elementowego zestawu danych, zrzuć resztę. Ale jak?Usuwanie danych z pliku HDF5

Czy ktoś ma doświadczenie w tym, jak to osiągnąć w HDF5? Najwyraźniej można to zrobić na kilka sposobów, przynajmniej:

  • (Rozwiązanie oczywiste), utwórz nowy, świeży plik i zapisz tam niezbędne dane, element po elemencie. Następnie usuń stary plik.
  • Albo, do starego pliku, utwórz nowy, świeży zestaw danych, zapisz tam potrzebne dane, odłącz stare dane za pomocą H5Gunlink() i pozbądź się niewykorzystanego wolnego miejsca, uruchamiając plik przez h5repack.
  • Lub przenieś interesujące elementy z istniejącego zestawu danych do początku (na przykład elementy przenoszenia 200-300 na pozycje 101-201 i elementy 350-400 na pozycje 202-252). Następnie wywołaj H5Dset_extent(), aby zmniejszyć rozmiar zestawu danych. Następnie możesz uruchomić pakiet h5repack, aby zwolnić wolne miejsce.

Ponieważ pliki mogą być dość duże, nawet jeśli nieistotne elementy zostały usunięte, wolałbym nie je przepisywać (zajęłoby to dużo czasu), ale wydaje się, że wymagane jest zwolnienie wolnej przestrzeni . Jakieś wskazówki od ekspertów HDF5?

Odpowiedz

8

HDF5 (przynajmniej wersja, do której przywykłem, 1.6.9) nie pozwala na usunięcie. Właściwie to robi, ale nie zwalnia użytej przestrzeni, przez co wciąż masz ogromny plik. Jak już powiedziałeś, możesz użyć h5repack, ale jest to strata czasu i zasobów.

Coś, co można zrobić, to mieć zestaw danych bocznych zawierający wartość boolowską, informującą, które wartości są "żywe", a które zostały usunięte. Nie powoduje to, że plik jest mniejszy, ale przynajmniej daje szybki sposób na usunięcie.

Alternatywą jest zdefiniowanie płyty w macierzy, skopiuj odpowiednie dane, następnie usuń starą tablicę lub zawsze uzyskaj dostęp do danych za pośrednictwem płyty, a następnie przedefiniuj ją tak, jak potrzebujesz (nigdy tego nie robiłem, jednak nie jestem pewien, czy jest to możliwe, ale powinno). Jeśli chcesz usunąć te rzeczy, skopiuj interesujące dane w innym zmontowanym pliku, odmontuj stary plik i usuń go, a następnie ponownie umieść nowy plik we właściwym miejscu. To rozwiązanie może być kłopotliwe (ponieważ masz wiele plików w pobliżu), ale pozwala na zwolnienie miejsca i operowanie tylko na podstronach drzewa danych, zamiast używania przepakowania.

+0

Dzięki za twoje myśli. Można to rzeczywiście zrobić na wiele sposobów. Miejmy nadzieję, że pewnego dnia do HDF5 zostaną dodane prawdziwe możliwości usuwania, takie bałaganiarstwo, aby po prostu usunąć rzeczy, jest prawie niedorzeczne ... Ale poza tym jest to dobry format pliku :-) –

+1

usuwanie i pakowanie nie jest łatwe. HDF5 jest jak system plików. Nawet jeśli zwolnisz bloki, oznaczając je jako usunięte, pakując plik, podczas gdy "na żywo" jest trudne i wąskie gardło wydajności. Stajesz wobec tego samego problemu z zaszyfrowanym systemem plików na MacOSX, więc domyślam się, że nie spodziewałbym się rozwiązania twojego problemu na poziomie HDF5 za każdym razem w przyszłości. –

+0

To prawda, że ​​nie jest to łatwe i może nie jest to szczególnie istotne dla programistów HDF5. Ale na pewno byłoby to możliwe - myślę, że większość baz danych może to zrobić. –

1

Kopiowanie danych lub używanie h5repack, jak opisałeś, to niestety dwa zwykłe sposoby "obkurczania" danych w pliku HDF5.

Problem, jak można się domyślić, polega na tym, że plik HDF5 ma skomplikowaną wewnętrzną strukturę (format pliku to here, dla każdego, kto jest ciekawy), więc usuwanie i pomniejszanie rzeczy powoduje pozostawienie dziury w identycznym rozmiarze plik. Najnowsze wersje biblioteki HDF5 mogą śledzić uwolnioną przestrzeń i ponownie ją wykorzystywać, ale twój przypadek użycia nie wydaje się być w stanie z tego skorzystać.

Jak wspomniano w drugiej odpowiedzi, możesz użyć zewnętrznych linków lub wirtualnego zestawu danych do skonstruowania plików HDF5, które byłyby bardziej podatne na manipulację, którą wykonujesz, ale podejrzewam, że nadal będziesz kopiować dużo danych, a to z pewnością zwiększy dodatkowe nakłady i zarządzanie plikami.

H5Gunlink() został przestarzały, przy okazji. Preferowanym zamiennikiem jest H5Ldelete().