2012-06-25 15 views
15

Zdaję sobie sprawę, że użytkownik SO wcześniej zapytał o to question, ale został poproszony w 2009 roku i miałem nadzieję, że dostępna jest większa wiedza na temat HDF5 lub nowsze wersje rozwiązały ten konkretny problem. Aby ponownie zadać pytanie dotyczące mojego własnego problemu;Usuwanie informacji z pliku HDF5

Mam gigantyczny plik węzłów i elementów z dużej geometrii i już zdobyłem wszystkie potrzebne informacje z niego. Dlatego w Pythonie próbuję zachować oryginalny plik, ale usuwam informacje, których nie potrzebuję, i uzupełniam informacje o innych źródłach. Na przykład mam zestaw danych węzłów, których nie potrzebuję. Muszę jednak zachować sąsiedni zestaw danych i zawrzeć informacje o ich indeksach z zewnętrznego pliku. Czy istnieje sposób na usunięcie tych konkretnych zestawów danych?

Czy jest to stara idea posiadania "osób zajmujących się umieszczaniem reklam" w pliku HDF5, który wciąż jest prawdziwy, tak, że nikt nie wie, jak usunąć/usunąć informacje? Nie martwię się zbytnio pustą przestrzenią, o ile szybsze jest usuwanie i dodawanie informacji, aby stworzyć całkowicie nowy plik.

Uwaga: Używam "r +" H5py do czytania i pisania.

Odpowiedz

15

Usunięcie całych węzłów (grup lub zestawów danych) z pliku hdf5 nie powinno stanowić problemu.
Jeśli jednak chcesz odzyskać miejsce, musisz uruchomić narzędzie h5repack.

Z hdf5 docs:

5.5.2. Usuwanie zestawu danych z pliku i ich odzyskiwania przestrzeni

HDF5 nie w tym czasie zapewniają łatwy mechanizm do usunięcia zestawu danych z pliku lub do odebrania z miejsca zajmowanego przez usuniętego obiektu.

Usunięcie zestawu danych i odzyskanie wykorzystanej przestrzeni można wykonać za pomocą funkcji H5Ldelete i programu narzędziowego h5repack. Dzięki funkcjiH5Ldelete można usunąć linki do zbioru danych ze struktury pliku . Po usunięciu wszystkich linków zestaw danych staje się niedostępny dla dowolnej aplikacji i jest skutecznie usuwany z pliku . Sposobem na odzyskanie miejsca zajmowanego przez odłączony zbiór danych jest , aby zapisać wszystkie obiekty pliku w nowym pliku. Każdy niepowiązany obiekt jest niedostępny dla aplikacji i nie będzie dołączany do nowego pliku w postaci . Zapisywanie obiektów do nowego pliku można wykonać za pomocą niestandardowego programu lub programu narzędziowego h5repack.

Można również rzucić okiem na narzędzie PyTables`s ptrepack. PyTables powinny być w stanie odczytać pliki hdfpy hdf5, a narzędzie ptrepack jest podobne do narzędzia h5repack.

Jeśli chcesz usunąć rekordy z zestawów danych, prawdopodobnie musisz pobrać rekordy, które chcesz zachować, i utworzyć nowy zestaw danych, a następnie usunąć stary.
PyTables obsługuje wiersze removing, jednak nie jest to zalecane.

+1

Dziękuję bardzo za szczegółowe wyjaśnienie i pomocne linki! Dokładnie tego potrzebowałem. – Ason

+1

Dzięki. Tak jest nadal. Zbadane/potwierdzone programowo [tutaj] (https://github.com/jackdotwa/python-concepts/blob/master/hdf5/reclaiming_space.ipynb). –

0

Jeśli wiesz, że dany zestaw danych zostanie usunięty na końcu procesu analizy, dlaczego w ogóle go przechowywać w pliku głównym? Dane tymczasowe zapisałbym w oddzielnym pliku HDF5, który mógł zostać usunięty po zakończeniu analizy.Jeśli ważne jest, aby połączyć tymczasowy zestaw danych w pliku głównym, po prostu utwórz zewnętrzne łącze między wzorcem a wzorcem przy użyciu H5Lcreate_external(). Linki zewnętrzne pochłaniają mało miejsca.