Jakie są wady używania.Pliki Rdata w porównaniu do HDF5 lub netCDF?

Zostałem poproszony o zmianę oprogramowania, które obecnie eksportuje .Pliki Rdata tak, że eksportuje w "niezależnym od platformy formacie binarnym", takich jak HDF5 lub netCDF. Podano dwa powody:

  1. pliki Rdata mogą być odczytywane tylko przez R
  2. Informacje binarne są przechowywane w różny sposób w zależności od systemów operacyjnych lub architektury

Odkryłem również, że "R Data import Export manual" nie omawia plików Rdata, chociaż omawia HDF5 i netCDF.

A dyskusja na temat r-help sugeruje, że .Pliki Rdata są niezależne od platformy.

Pytania:

  1. w jakim stopniu te obawy są ważne?
    • np. can MATLAB read .Rdata bez wywoływania R?
  2. są inne formaty bardziej przydatne w tym zakresie niż .Pliki Rdata?
  3. czy istnieje możliwość napisania skryptu, który utworzyłbyanalogów hdf5 wszystkich .Pliki Rdata, minimalizujące zmiany w samym programie?
Author: Iterator, 2011-10-20

4 answers

Oto różne odpowiedzi:

  1. Obfitość opcji Po pierwsze, obawy są ważne, ale twoja lista wyborów jest trochę węższa niż powinna być. HDF5 / netCDF4 jest doskonałą opcją i działa dobrze z Pythonem, Matlab i wieloma innymi systemami. HDF5 jest lepszy od Pythona pickle storage pod wieloma względami-sprawdź PyTables, a najprawdopodobniej zobaczysz dobre przyspieszenie. Matlab miał (i może nadal mieć) pewne problemy z tym, jak duża komórka (a może struct) tablice są przechowywane w HDF5. Nie chodzi o to, że nie może tego zrobić, ale że to było cholernie powolne. To jest problem Matlaba, a nie HDF5. chociaż są to świetne wybory, możesz również rozważyć, czy HDF5 jest odpowiedni: zastanów się, czy masz bardzo duże pliki i możesz skorzystać z zastrzeżonego kodowania, zarówno dla szybkości dostępu, jak i kompresji. Nie jest to zbyt trudne do zrobienia raw binary storage w dowolnym języku i można łatwo zaprojektować coś takiego jak przechowywanie plików bigmemory (tj. dostęp). W rzeczywistości, można nawet użyć bigmemory plików w innych językach - to naprawdę bardzo prosty format. HDF5 jest z pewnością dobrym punktem wyjścia, ale nie ma jednego uniwersalnego rozwiązania do przechowywania i dostępu do danych, szczególnie , gdy dostajemy się do bardzo dużych zbiorów danych. (W przypadku mniejszych zestawów danych, możesz również spojrzeć na bufory protokołów lub inne formaty serializacji; Dirk zrobił RProtoBuf, aby uzyskać dostęp do nich w R.) sugestia.

  2. Rozmiar jak wspomniał Dirk, formaty plików można opisać jako neutralne dla aplikacji i zależne od aplikacji. Inną osią jest domain-independent (lub domain-ignorant) lub domain-dependent (domain-smart; -)) storage. Jeśli masz pewną wiedzę o tym, jak powstają Twoje dane, zwłaszcza informacje, które mogą być używane w kompresji, możesz być w stanie zbudować lepszy format niż cokolwiek, co standardowe kompresory mogą być w stanie zrobić. To zajmuje trochę praca. Alternatywne kompresory niż gzip i bzip pozwalają również analizować duże ilości danych i opracowywać odpowiednie "słowniki" kompresji, dzięki czemu można uzyskać znacznie lepszą kompresję, że z.Pliki Rdat. W przypadku wielu rodzajów zbiorów danych przechowywanie delty między różnymi wierszami w tabeli jest lepszym rozwiązaniem - może prowadzić do znacznie większej ściśliwości (np. może pojawić się wiele 0s), ale tylko Ty wiesz, czy to zadziała dla Twoich danych.

  3. Prędkość i access .Rdat nie obsługuje dostępu losowego. Nie ma wbudowanej obsługi równoległych We/Wy (chociaż możesz serializować do równoległej pamięci we / wy, jeśli chcesz). Jest wiele rzeczy, które można tutaj zrobić, aby poprawić rzeczy, ale to tysiąc cięć do klejenia rzeczy na .Rdat w kółko, zamiast po prostu przełączyć się na inny mechanizm przechowywania i zdmuchnąć problemy z prędkością i dostępem. (Nie jest to tylko zaleta HDF5: często używałem funkcji wielordzeniowych do paralelizować inne metody wejścia/wyjścia, takie jak bigmemory.)

  4. Możliwości aktualizacji R nie ma zbyt ładnego sposobu dodawania obiektów do a .Plik Rdat. To nie, z mojej wiedzy, oferują żadnych "widzów", aby umożliwić użytkownikom wizualnie sprawdzić lub przeszukiwać kolekcję .Pliki Rdat. Według mojej wiedzy nie oferuje on żadnego wbudowanego zapisu wersjonowania obiektów w pliku. (Robię to poprzez osobny obiekt w pliku, który rejestruje wersje skryptów które generowały obiektów, ale zlecę to SQLite w przyszłej iteracji.) HDF5 ma to wszystko. (Również losowy dostęp wpływa na aktualizację danych - .Pliki Rdat, musisz zapisać cały obiekt.)

  5. Wspolne Wsparcie Choc opowiadalem sie za wlasnym formatem, to jest dla ekstremalnych rozmiarow danych. Posiadanie bibliotek dla wielu języków jest bardzo pomocne w zmniejszaniu tarcia związanego z wymianą danych. Dla większości prostych zbiorów danych (a simple wciąż oznacza " dość złożony" w większości przypadków) lub umiarkowanych do dość dużych zbiorów danych, HDF5 jest dobrym formatem. Jest sposób, aby pokonać to na wyspecjalizowanych systemach, oczywiście. Mimo to jest to miły standard i oznacza mniej wysiłku organizacyjnego zostanie wydane na wspieranie formatu zastrzeżonego lub specyficznego dla aplikacji. Widziałem organizacje trzymać się formatu przez wiele lat po użyciu aplikacji, która generowała dane, tylko dlatego, że tak dużo kodu zostało napisane, aby załadować i zapisać w formacie tej aplikacji i GBs lub TBs danych były już przechowywane w jego formacie (To może być you & R kiedyś, ale to wynikało z innego pakietu statystycznego, który zaczyna się na literę "S", a kończy na literę "S" ;-)). To bardzo poważne tarcie dla przyszłej pracy. Jeśli korzystasz z szeroko rozpowszechnionego formatu standardowego, możesz z łatwością przenosić go do innych popularnych standardów: jest bardzo prawdopodobne, że ktoś inny postanowił rozwiązać ten sam problem. Spróbuj - jeśli zrobisz konwerter teraz, ale w rzeczywistości nie Konwertuj go do użytku, przynajmniej stworzyłeś narzędzie, które inni mogliby podnieść i użyć, jeśli nadejdzie czas, gdy konieczne jest przejście do innego formatu danych.

  6. Pamięć Z .Pliki Rdat, musisz load lub attach to, aby uzyskać dostęp do obiektów. Przez większość czasu, ludzie load Plik. Cóż, jeśli plik jest bardzo duży, idzie dużo pamięci RAM. Tak więc albo ktoś jest nieco mądrzejszy w używaniu attach, albo dzieli obiekty na wiele plików. To jest dość uciążliwe dla dostępu do małych części obiektu. W tym celu używam mapowania pamięci. HDF5 umożliwia losowy dostęp do części pliku, więc nie musisz ładować wszystkich danych tylko po to, aby uzyskać dostęp do niewielkiej części. To tylko część tego, jak to działa. Tak więc, nawet w R, istnieją lepsze opcje niż tylko .Pliki Rdat.

  7. Skrypty do konwersji Jeśli chodzi o twoje pytanie dotyczące pisania skryptu - tak, możesz napisać skrypt, który ładuje obiekty i zapisuje je do HDF5. Jednak niekoniecznie mądre jest robienie tego na ogromnym zestawie heterogenicznych plików, chyba że masz dobre zrozumienie tego, co zostanie utworzone. Nie mogłem zacząć projektować tego dla własnych zbiorów danych: jest tam zbyt wiele jednorazowych obiektów, a stworzenie ogromnej biblioteki plików HDF5 byłoby śmieszne. Lepiej myśleć o tym jak o założeniu bazy danych: co chcesz przechowywać, jak ją przechowywać i jak będzie ona reprezentowana i dostępna?

Once you uzyskaj plan konwersji danych, możesz użyć narzędzi takich jak Hadoop lub nawet podstawowej funkcji wielordzeniowej, aby uwolnić swój program konwersji i zrobić to tak szybko, jak to możliwe.

W skrócie, nawet jeśli pozostaniesz w R, dobrze jest przyjrzeć się innym możliwym formatom przechowywania, szczególnie w przypadku dużych, rosnących zbiorów danych. Jeśli musisz udostępniać dane innym osobom lub przynajmniej zapewnić dostęp do odczytu lub zapisu, inne formaty są bardzo zalecane. Nie ma powodu, by poświęć czas na utrzymywanie czytelników / pisarzy dla innych języków - to tylko dane, a nie kod. :) Skoncentruj swój kod na tym, jak manipulować danymi w rozsądny sposób, zamiast poświęcać czas na pracę nad pamięcią masową-inni ludzie wykonali już bardzo dobrą robotę.

 28
Author: Iterator,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-25 19:01:30

(binarne) formaty plików występują w dwóch podstawowych odmianach:

  • zastosowanie-neutralne, obsługiwane przez biblioteki publiczne i interfejsy API (i zarówno netCDF, jak i HDF5 należą do tego obozu), które ułatwiają wymianę danych między różnymi programami i aplikacjami pod warunkiem, że są one rozszerzone o dodatkowe pakiety za pomocą interfejsów API

  • specyficzne dla aplikacji przeznaczone tylko do pracy z jednym programem, aczkolwiek bardziej efektywnie: czyli co ?RData does

Ponieważ R jest open-source, możesz odtworzyć format RData z plików Matlab: nic nie stoi na przeszkodzie, aby napisać odpowiedni plik mex, który. Może ktoś już to zrobił. Nie ma technicznego powodu, aby nie próbować - - - ale druga trasa może być łatwiejsza, jeśli obie aplikacje przeznaczone do udostępniania danych obsługują Format równie dobrze.

Jeśli to coś warte, we wczesnych/połowie lat 90., napisałem własny kod C, aby pisać pliki symulacji w format binarny używany przez Octave (którego użyłem później). Możliwość zrobienia tego z oprogramowaniem open source to duży plus.

 9
Author: Dirk Eddelbuettel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-20 17:46:49

Myślę, że mogę odpowiedzieć na kilka, ale nie na wszystkie te pytania.

  1. Cóż, każdy, kto się nad tym zastanowi, może prawdopodobnie odczytać plik .Rdata bezpośrednio, ale to ciężka praca i niewiele korzyści. Wątpię, żeby Matlab to zrobił. Jak zapewne pamiętasz, R może czytać różne inne formaty systemowe właśnie dlatego, że ktoś włożył w to wiele wysiłku.

  2. Dla formatów tekstowych csv wydaje się dość "standardowy", ale dla formatów binarnych Nie wiem - a csv nie jest dobrym standard w tym-to bardzo różni się jak (szczególnie) daty i cudzysłowy są obsługiwane (i oczywiście działa tylko dla tabel danych).

  3. Oczywiście!

Przykład:

for(f in list.files(".", pattern="\\.Rdata$") {
    e <- new.env()
    load(f, e)       # load all values into environment e
    x <- as.list(e)

    #saveInOtherFormat(x, file=sub("\\.Rdata$", ".Other", f))
}
 5
Author: Tommy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-20 16:02:55

Punkt 2 jest zły: binarny .Pliki RData przenośne na platformach sprzętowych i operacyjnych. Cytat ze strony pomocy dla ?Zapisz:

Wszystkie platformy R używają reprezentacji XDR (bigendian) C i podwaja się w binarnych plikach save-d, a te są przenośne na wszystkich platformach R.

Punkt 1 jest funkcją tego, czym są dane i jakie inne programy mogą być użytecznie zastosowane do danych. Jeśli baza kodu używa save () do zapisu określonych obiektów, które są dataframami lub macierzami, możesz łatwo napisać małą funkcję save2hdf (), aby zapisać je jako pliki binarne hdf lub ncdf, a następnie użyć sed do zmiany wszystkich wystąpień save( na save2hdf( w Twojej bazie kodowej. Przynajmniej ncdf będzie miał hit wydajności na odczyty, ale nie jest tak źle hit. Jeśli twój kod używa zapisywania obiektów, takich jak listy obiektów heterogenicznych, prawdopodobnie nie możesz użyć ncdf lub hdf bez dużego przekodowania do wypisywania oddzielnych obiektów składowych.

Zauważ również, że netCDF 4 jest nadal problematyczny w R.

 4
Author: tomp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-24 22:19:03