Odpowiedzi:
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/
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.
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.
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.
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.
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
Mogę powiedzieć, do jakich zastosowań go używam i widziałem, jak jest używany do:
To są te, dla których go używam
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.