Zastanawiam się nad pomysłem stworzenia trwałej pamięci masowej, takiej jak silnik dbms, jakie byłyby korzyści z tworzenia niestandardowego formatu binarnego bezpośrednio nad cPickowaniem obiektu i/lub przy użyciu modułu półki?Jakie są zalety niewykorzystywania cPickle do utworzenia trwałego miejsca na dane?
Odpowiedz
Marynowanie to moneta dwustronna.
Po jednej stronie można w łatwy sposób przechowywać obiekt. Tylko cztery linie kodu i ty się marnujesz. Masz obiekt dokładnie taki, jaki jest.
Po drugiej stronie może stać się koszmarem kompatybilności. Nie można oddzielić obiektów, jeśli nie są zdefiniowane w kodzie, dokładnie tak, jak zostały zdefiniowane podczas kiszenia. To zdecydowanie ogranicza twoją zdolność do refaktoryzacji kodu lub przestawiania rzeczy w twoich modułach. Ponadto, nie wszystko może być marynowane, a jeśli nie jesteś surowy na tym, co zostanie wytrawione, a klient twojego kodu ma pełną swobodę w włączaniu dowolnego obiektu, prędzej czy później przekaże coś nieobliczalnego do twojego systemu, a system przejdzie Bum.
Należy bardzo uważać na jego użycie. nie ma lepszej definicji szybkiej i brudnej.
Należy zauważyć, że nie wszystkie obiekty mogą być bezpośrednio marynowane - tylko podstawowe typy lub obiekty, które zdefiniowały protokół piklowania.
Używanie własnego formatu binarnego pozwoliłoby na potencjalnie przechowywanie dowolnego rodzaju obiektów.
Na marginesie, Zope Object DB (ZODB) stosuje to samo podejście, przechowując obiekty z formatem pikle. Być może zainteresują Cię ich implementacje.
marynata może obsługiwać większość klas zdefiniowanych przez użytkownika bez dodatkowego kodu. w niektórych przypadkach musisz tylko zdefiniować specjalną obsługę protokołu pikle. – Nelson
potencjalnych zalet formatu niestandardowego na zalewie są:
- można selektywnie otrzymać poszczególne obiekty, zamiast wcielać pełnego zestawu obiektów
- można kwerendy podzbiorów obiektów o właściwościach i ładuj tylko te obiekty, które pasują do twoich kryteriów.
Bez względu na to, czy te zalety się pojawią, oczywiście zależy to od sposobu zaprojektowania magazynu.
Jednym z powodów zdefiniowania własnego niestandardowego formatu binarnego może być optymalizacja. pickle (i shelve, który używa pickle) to ogólny framework do serializacji; może przechowywać prawie wszystkie dane Pythona. Łatwo jest używać pikle w wielu sytuacjach, ale potrzeba czasu, aby sprawdzić wszystkie obiekty i szeregować ich dane, a same dane są przechowywane w ogólnym, pełnym formacie. Jeśli przechowujesz określone znane dane, skonstruowany na zamówienie serializer może być zarówno szybszy, jak i bardziej zwięzły.
zajmuje 37 bajtów marynowane obiektu z jedną wartością całkowitą:
>>> import pickle >>> class Foo: pass... >>> foo = Foo() >>> foo.x = 3 >>> print repr(pickle.dumps(foo)) "(i__main__\nFoo\np0\n(dp1\nS'x'\np2\nI3\nsb."
Osadzony że dane nazwa obiektu i jego typu. Niestandardowy serializator dla Foo (i samego Foo) może zrezygnować z tego i po prostu zapisać numer, oszczędzając czas i przestrzeń.
Innym powodem niestandardowej struktury serializacji jest możliwość łatwego sprawdzania i porównywania danych. Jeśli zmienisz typy obiektów i będziesz musiał wczytać starą wersję danych, może to być trudne dzięki marynacie. Twój własny kod można łatwo dostosować do starszych formatów danych.
W praktyce zbudowałem coś, używając ogólnego modułu cPickle i zastępując go tylko wtedy, gdy profilowanie wskazywało na to, że było to naprawdę ważne. Utrzymanie oddzielnego frameworku serializacji to znaczna ilość pracy.
Jeden ostateczny zasób, który może okazać się przydatny: some synthetic serializer benchmarks. cPickle jest dość szybki.
Jeśli masz zamiar to zrobić (wdrożyć własny format binarny), powinieneś najpierw wiedzieć, że Python ma dobrą bibliotekę do obsługi HDF5, binarnego formatu używanego w fizyce i astronomii do zrzucania ogromnych ilości danych.
To jest strona główna biblioteki:
Zasadniczo, można myśleć hdf5 jako hierarchicznej bazy danych, w której kolumna tabela może zawierać wewnętrzną tabelę sam : tabela Populations ma kolumnę o nazwie Individual, która jest tabelą zawierającą informacje o każdej osobie, itd ...
PyTables ma również własną implementację modułu cPickle, możesz ESS go:
$ easy_install tables
$ python
>>> import tables
>>> tables.cPickle
nigdy nie używane marynatę pytable, ale myślę, że może to być proste, aby dowiedzieć się, jak to działa, więc być może trzeba spojrzeć na to przed wykonaniem własnego formatu.
Czy kiedykolwiek będziesz musiał przetwarzać dane z niezaufanych źródeł? Jeśli tak, powinieneś wiedzieć, że format pikla jest tak naprawdę maszyną wirtualną, która jest w stanie wykonać dowolny kod w imieniu procesu, który powoduje rozprysk.
Zobacz to rozwiązanie na SourceForge:
y_serial.py obiektów Pythona moduł :: magazyn z SQLite
„serializacji + oporność :: w kilku linii kodu, kompresji i opisywanie Python obiektów w SQLite; następnie pobrać je chronologicznie według słów kluczowych bez żadnego SQL.Najbardziej przydatny "standardowy" moduł do bazy danych do przechowywania danych bez schematu. "
http://yserial.sourceforge.net
[Komentarz dołączone do przypisów końcowych źródłowych omawia dlaczego ogórek został wybrany przez JSON.]
jeśli używa się pikle, nie jest to bezpieczne dla projektu opartego na sieci, to jest to? – amirouche
y_serial usuwa tylko zaufane pikle utworzone przez własne funkcje, dzięki czemu jest bezpieczne. Powinieneś przeczytać przypisy końcowe w samym module, który daje szczegółowe wyjaśnienie. –
+1 za problem dotyczący refaktoryzacji –