2015-05-06 9 views
14

Występują niektóre naprawdę dziwne interakcje między h5py, PyTables (przez Pandas) i C++ wygenerowane pliki HDF5. Wydaje się, że h5check i h5py wydają się radzić sobie z nazwami typów zawierającymi "/", ale nie może. Najwyraźniej istnieje luka w moim rozumieniu, więc:"/" w nazwach w zamieszaniu plików HDF5

Czego tu nie rozumiem?


Gór szczegółów

Mam następujące dane w pliku HDF5:

[...] 
    DATASET "log" { 
     DATATYPE H5T_COMPOUND { 
     H5T_COMPOUND { 
      H5T_STD_U32LE "sec"; 
      H5T_STD_U32LE "usec"; 
     } "time"; 
     H5T_IEEE_F32LE "CIF/align/aft_port_end/extend_pressure"; 
     [...] 

ten został utworzony za pomocą C++ API. Narzędzie h5check mówi, że plik jest prawidłowy.

Należy pamiętać, że CIF/align/aft_port_end/extend_pressurenie jest rozumiane jako ścieżka do grupy/węzła/liścia. Jest to etykieta, którą używamy wewnętrznie, która ma wewnętrzną strukturę zawierającą znaki "/" jako ograniczniki. Nie chcemy, aby plik HDF5 wiedział o tym coś: nie powinno to obchodzić. Oczywiście, jeśli "/" są nielegalne w nazwie HDF5, to musimy zmienić to ograniczenie na coś innego.

Korzystanie PyTables (w porządku, Pandas ale używa PyTables wewnętrznie) do odczytu pliku, otrzymuję

>>> import pandas as pd 
>>> store = pd.HDFStore('data/XXX-20150423-071618.h5') 
>>> store 
/home/XXX/virt/env/develop/lib/python2.7/site-packages/tables/group. py:1156: UserWarning: problems loading leaf ``/log``:: 

    the ``/`` character is not allowed in object names: 'XXX/align/aft_port_end/extend_pressure' 

The leaf will become an ``UnImplemented`` node. 

Pytałem o to w tym question i got told że '/' są illegal in the specification. Jednak sprawy się obcy z h5py ...

Korzystanie h5py do odczytu pliku, mam co chcę:

>>> f['/log'].dtype 
>>> dtype([('time', [('sec', '<u4'), ('usec', '<u4')]), ('CI 
F/align/aft_port_end/extend_pressure', '<f4')[...] 

Który jest mniej więcej to, co określono z.

Nie trzeba dodawać, jestem zdezorientowany. Czy udało mi się utworzyć nielegalny plik HDF5, który w jakiś sposób mija h5check? Czy PyTables nie obsługuje tego przypadku krawędzi? ... Jestem zdezorientowany.


Oczywiście, mógłbym napisać prosty wrapper coś takiego:

>>> import matplotlib.pyplot as plt 
>>> silly = pd.DataFrame(f['/log']['CIF/align/aft_port_end/extend_pressure']) 
>>> silly.plot() 
>>> plt.show() 

uzyskać wszystkie dane z pliku HDF5 do Pandas. Jednak nie jestem pewien, czy jest to dobry pomysł z powodu wcześniejszego zamieszania. Moją największą obawą jest to, że konwersja może nie być skalowalna, jeśli dane są bardzo duże ...

Odpowiedz

5

Przeglądałem trochę przez h5check source i nie mogę znaleźć żadnego miejsca, w którym testowałoby, czy nazwa zawiera ukośnik. Możesz sprawdzić komunikaty o błędach, które może wygenerować, używając:

grep error_push h5checker.c -A1 

Podane linki wyraźnie informują, że ukośniki nie są dozwolone w nazwach obiektów. Tak tak, myślę, że zrobiłeś plik, który jest nielegalny, ale przechodzi test h5check. Narzędzie wydaje się bardziej skupiać na układzie danych binarnych. Najbliższym sprawdzianem, jaki mogę znaleźć, jest ochrona przed zduplikowanymi nazwami.

Moim zdaniem to wszystko. Fakt, że h5py i inne biblioteki w jakiś sposób są w stanie utworzyć lub odczytać ten nielegalny plik, jest nieistotny. Specyfikacja mówi: "nie umieszczaj ukośników w nazwach obiektów", więc nie. Koniec opowieści.

Jeśli nie jesteś przekonany, pomyśl o tym w ten sposób: jeśli w jakiś sposób udało ci się utworzyć zwykły plik z ukośnikiem w nazwie pliku, co by się stało? Większość programów zakłada, że ​​nazwy plików nie zawierają ukośników, a zatem są w stanie podzielić ścieżkę katalogu, dzieląc ją na znaki ukośne. Twój plik złamie to zachowanie i wprowadzi wiele subtelnych (i nie tak subtelnych) błędów. Użytkownicy będą narzekać, programiści będą cię nienawidzić, administratorzy systemu będą cię przeklinać.

Podobnie można założyć, że wiele innych bibliotek i programów nie będzie w stanie obsługiwać ukośników w nazwach zmiennych. Fajną rzeczą w HDF jest to, że istnieje tak wiele narzędzi i za pomocą ukośników odrzucasz tę przewagę. Możesz myśleć, że to nie jest ważne, może twoje pliki HDF-5 są przeznaczone tylko do użytku wewnętrznego. Jednak sytuacja może się zmienić w ciągu 5 lat, jak to zwykle bywa w sytuacjach.

Wystarczy ugryźć bullet i zamień "/" na "|" przed zapisaniem zmiennych do HDF5. Wymień je z powrotem, gdy je przeczytasz. Czas stracony przez zaimplementowanie tego, odzyskasz x-fold (dla x> 1), unikając przyszłych błędów i skarg użytkowników.

Przepraszam za tyradę, ale mam nadzieję, że cię przekonałem.

+0

Wygraliśmy głosowanie, przyjęcie i nagrodę, ponieważ była to najlepsza odpowiedź. – Sardathrion

+1

@Sardathrion, twój plik jest całkowicie w porządku. Nie ma żadnych ograniczeń związanych z odcięciem, które znam na etykietach członków typu złożonego. Dokument, który łączysz, odnosi się do nazw w przestrzeni nazw "grup"; tj. ścieżki w stylu POSIX do obiektów w pliku. –

+0

@ andrew-collette: myślisz, że to jest błąd w PyTables? Sardathrion, chociaż najwyraźniej błędnie zinterpretowałem specyfikacje, a plik jest poprawny, podtrzymuję mój punkt widzenia: używając slashów, ryzykujesz problemami z innymi bibliotekami i programami. Można tego łatwo uniknąć, zastępując je. – titusjan

2

Czy możesz użyć h5py, aby przeczytać wszystkie pliki i przepisać je bez obraźliwych znaków, aby pytables mógł je przeczytać?

Jeśli jest poza spec, zakładam, że to, czego doświadczamy jest tak, że niektóre implementacje poradzić, a inni nie ...

+0

To byłaby jednorazowa poprawka, o ile można zaktualizować interfejs API C++, z którego pochodzą złe znaki. Lub będziesz musiał umieścić ten etap wstępnej obróbki w swoim przepływie pracy. – tmthydvnprt

+0

Pierwsza część jest tym, o czym była moja ostatnia edycja: tak, mogę to zrobić. Jednak wydaje się być trochę wymyślony. Ostatnia część, nie jestem pewien, czy jest poza specyfikacjami, czy nie. Wydaje się, że wszystkie h5check, C++ API i h5py są w porządku.Tylko PyTables narzeka. – Sardathrion

0

upewnij się, że tworzenie grup, a nie tylko nazwa się ścieżka prawo - jest to prawdopodobnie miejsce, w którym wada się wkrada. Jeśli utworzysz grupy dla twoich obiektów, a następnie nazwałeś obiekty z nazwami liści (extens_pressure w powyższym), nie będziesz miał żadnych problemów.

H5py jest dość cienkim opakowaniem w bibliotece C HDF5, pandy/drażetki mają o wiele większą wagę w podejściu - lub przynajmniej mają o wiele więcej swojej własnej semantyki - i dlatego sprawdzają, aby upewnić się nie masz "/" w nazwach obiektów. Należy jednak pamiętać, że wszyscy korzystają z biblioteki HDF5 pod koniec dnia, ponieważ podczas gdy HDF5 jest świetny, byłoby ogromnym wysiłkiem, aby dokonać alternatywnej implementacji - poza zasoby Pandas/Pytables.

Drobne zastrzeżenie: Przedtem włamałem się do wewnętrznych wersji HDF5 i H5py.

+0

'" CIF/align/aft_port_end/extend_pressure "' nie jest ścieżką do węzła/liścia grupy. Jest to nazwa sama w sobie, tylko etykieta o wewnętrznej strukturze, której HDF5 nie powinno się przejmować. Przynajmniej taka jest teoria. – Sardathrion

+0

@Sardathrion tak, to właśnie zebrałem. Pomyśl o tym jak o systemie plików - nazwa pliku nie może mieć ścieżki ukośne (lub przynajmniej jej zła praktyka). W każdym razie, gdy biblioteka HDF5 z nią pracuje - nie widzi w 100% specyfikacji, mimo że ta sama grupa dokonała specyfikacji - to tylko rzeczywistość. Szkoda, że ​​tworzenie takiego zestawu danych nie powoduje automatycznego utworzenia ścieżki, ale taka jest biblioteka - aby uniknąć tego błędu/problemu, należy poprawnie korzystać z grup. –

Powiązane problemy