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.