Typowe przypadki użycia marynaty w Pythonie


134

Spojrzałem na marynatę dokumentację , ale nie rozumiem, gdzie jest przydatna marynata.

Jakie są typowe przypadki użycia marynaty?


2
Część, której nie rozumiem, jeśli chodzi o wytrawianie, to dlaczego po prostu nie zapiszesz wartości w pliku? Po co to marynować?
whackamadoodle3000

Odpowiedzi:


59

Niektóre zastosowania, z którymi się spotkałem:

1) zapisywanie danych stanu programu na dysku, aby mógł on kontynuować od miejsca, w którym został przerwany po ponownym uruchomieniu (trwałość)

2) wysyłanie danych Pythona przez połączenie TCP w systemie wielordzeniowym lub rozproszonym (krosowanie)

3) przechowywanie obiektów Pythona w bazie danych

4) konwertowanie dowolnego obiektu Pythona na ciąg znaków, aby można go było użyć jako klucza słownika (np. Do buforowania i zapamiętywania).

Z tym ostatnim jest kilka problemów - dwa identyczne obiekty mogą zostać wytrawione i spowodować powstanie różnych łańcuchów - lub nawet ten sam obiekt dwukrotnie marynowany może mieć różne reprezentacje. Dzieje się tak, ponieważ marynata może zawierać informacje o liczbie referencyjnej.

Aby podkreślić komentarz @ lunaryorn - nigdy nie powinieneś usuwać łańcucha z niezaufanego źródła, ponieważ starannie spreparowana marynata może wykonać dowolny kod w twoim systemie. Na przykład patrz https://blog.nelhage.com/2011/03/exploiting-pickle/


27
Nie należy przesyłać marynowanych obiektów przez sieć lub inne niezaufane kanały, chyba że marynowane dane są starannie zabezpieczone przed manipulacją. Dokumentacja marynowana wyraźnie ostrzega, aby nigdy nie usuwać danych z niezaufanych lub nieuwierzytelnionych źródeł.
lunaryorn

4
@lunaryorn: dobra uwaga. Jeśli zamierzasz przesyłać wytrawione dane między maszynami, użyj bezpiecznego kanału, takiego jak tunelowanie SSL lub SSH.
Dave Kirby

3
W takim razie nadal ufasz, że punkt końcowy Cię nie wykorzysta, co może być w porządku lub nie, w zależności od kontekstu.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

@lunaryorn - dobra uwaga, ale w takim przypadku jak możemy zaszyfrować dane w domenie publicznej. czy musimy użyć jakiejś innej piki lib czy nie używać marynaty
Pardeep Sharma

Czy punkt 4) jest prawdziwy? Znalazłem to, które ma pewne (stare) dowody, które tutaj nie zadziałają .
salotz

10

Minimalny przykład podróży w obie strony.

>>> import pickle
>>> a = Anon()
>>> a.foo = 'bar'
>>> pickled = pickle.dumps(a)
>>> unpickled = pickle.loads(pickled)
>>> unpickled.foo
'bar'

Edit: ale jak na pytanie o konkretne przykłady z zalewą, być może na najbardziej zaawansowanym wykorzystaniu trawienia (trzeba by kopać bardzo głęboko do źródła) jest ZODB: http://svn.zope.org/

W przeciwnym razie PyPI wspomina o kilku: http://pypi.python.org/pypi?:action=search&term=pickle&submit=search

Osobiście widziałem kilka przykładów piklowanych obiektów przesyłanych przez sieć jako łatwy w użyciu protokół transferu sieciowego.


8

W przypadku obliczeń rozproszonych i równoległych wytrawianie jest absolutnie konieczne.

Załóżmy, że chcesz wykonać równoległą redukcję mapy z multiprocessing(lub między węzłami klastra za pomocą pyina ), a następnie musisz upewnić się, że funkcja, którą chcesz zmapować w równoległych zasobach, będzie się trawić. Jeśli się nie wytrawia, nie możesz wysłać go do innych zasobów w innym procesie, komputerze itp. Zobacz także tutaj dobry przykład.

Aby to zrobić, używam koperku , który może serializować prawie wszystko w Pythonie. Dill ma również dobre narzędzia, które pomogą ci zrozumieć, co powoduje niepowodzenie wytrawiania, gdy kod nie działa.

I tak, ludzie używają wybierania, aby zapisać stan obliczeń, sesję ipython lub cokolwiek innego.


7

Użyłem go w jednym z moich projektów. Jeśli aplikacja została zakończona w trakcie działania (wykonała długie zadanie i przetworzyła wiele danych), musiałem zapisać całą strukturę danych i załadować ją ponownie po ponownym uruchomieniu aplikacji. Użyłem do tego cPickle, ponieważ szybkość była kluczowa, a rozmiar danych był naprawdę duży.


4

Pickle działa jak „Zapisz jako…” i „Otwórz…” dla struktur i klas danych. Powiedzmy, że chcę zapisać moje struktury danych, aby były trwałe między uruchomieniami programu.

Oszczędność:

with open("save.p", "wb") as f:    
    pickle.dump(myStuff, f)        

Ładowanie:

try:
    with open("save.p", "rb") as f:
        myStuff = pickle.load(f)
except:
    myStuff = defaultdict(dict)

Teraz nie muszę od nowa budować myStuff od zera i mogę po prostu wybrać (le) od miejsca, w którym przerwałem.


3

Początkującym (tak jak u mnie) naprawdę trudno jest zrozumieć, po co w pierwszej kolejności używać marynaty, czytając oficjalną dokumentację . Może dlatego, że dokumentacja sugeruje, że znasz już cały cel serializacji. Dopiero po przeczytaniu ogólnego opisu serializacji zrozumiałem powód tego modułu i jego typowe przypadki użycia. Pomocne mogą być również obszerne wyjaśnienia dotyczące serializacji z pominięciem określonego języka programowania: https://stackoverflow.com/a/14482962/4383472 , Co to jest serializacja? , https://stackoverflow.com/a/3984483/4383472


twoja „odpowiedź” nie jest odpowiedzią, to raczej komentarz. Pytanie OP brzmi: „Jakie są typowe przypadki użycia marynaty?”. Czy uważasz, że w jakikolwiek sposób odpowiedziałeś na to pytanie?
Mike McKerns

3
cóż, czuję, że odpowiedziałem na to pytanie, ponieważ miałem również trudności ze zrozumieniem powszechnych zastosowań marynaty, kiedy próbowałem przeczytać o tym module tutaj , tutaj i tutaj . Ponieważ najczęściej zaczynają wyjaśniać, co robi pikle, zakładając, że znasz motywację stojącą za całą koncepcją serializacji. Po przeczytaniu prostego artykułu na wiki o serializacji zrozumiałem zarówno ogólny pomysł, jak i „typowe przypadki”. Może to komuś pomoże ...
Zły

a niektóre z tych typowych przypadków to…? Jeśli są takie, których nie ma tutaj w innych odpowiedziach… dodanie ich do odpowiedzi byłoby bardzo właściwe.
Mike McKerns

2

Aby dodać przykład ze świata rzeczywistego: narzędzie dokumentacyjne Sphinx dla Pythona używa pickle do buforowania przeanalizowanych dokumentów i odsyłaczy między dokumentami, aby przyspieszyć tworzenie kolejnych dokumentów.


1

Mogę powiedzieć, do jakich zastosowań go używam i widziałem, jak jest używany do:

  • Zapisywanie profilu gry
  • Dane gry ratują życie i zdrowie
  • Poprzednie rekordy powiedz liczb wprowadzonych do programu

To są te, dla których go używam


1

Używam wytrawiania podczas złomowania stron internetowych w tym czasie chcę przechowywać ponad 8000 tys. Adresów URL i chcę je przetwarzać tak szybko, jak to możliwe, więc używam wytrawiania, ponieważ jego jakość wyjściowa jest bardzo wysoka.

możesz łatwo dotrzeć do adresu URL i gdzie zatrzymać nawet słowo kluczowe katalogu zadań, a także bardzo szybko pobrać szczegóły adresu URL w celu wznowienia procesu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.