Відповіді:
Деякі використання, які я натрапив:
1) збереження даних про стан програми на диску, щоб вона могла переноситись там, де вона була відключена при перезапуску (наполегливість)
2) передача даних python через TCP-з'єднання в багатоядерній або розподіленій системі (маршалінг)
3) зберігання об’єктів python у базі даних
4) перетворення довільного об’єкта python у рядок, щоб він міг використовуватися як ключ словника (наприклад, для кешування та запам'ятовування).
З останньою є деякі проблеми - два однакових об'єкта можуть бути мариновані та призводити до різних рядків - або навіть один і той же об’єкт, зібраний двічі, може мати різні подання. Це пояснюється тим, що соління може включати інформацію щодо підрахунку.
Щоб підкреслити коментар @ lunaryorn - ніколи не слід видаляти рядок з недовіреного джерела, оскільки ретельно продуманий соління може виконувати довільний код у вашій системі. Наприклад, див. Https://blog.nelhage.com/2011/03/exploiting-pickle/
Приклад мінімального кругового переходу ..
>>> import pickle
>>> a = Anon()
>>> a.foo = 'bar'
>>> pickled = pickle.dumps(a)
>>> unpickled = pickle.loads(pickled)
>>> unpickled.foo
'bar'
Edit: а як на питання про реальних прикладах травлення, можливо , з самим передовим використанням засолювання (ви повинні копати досить глибоко в джерело) є ZODB: http://svn.zope.org/
В іншому випадку PyPI згадує декілька: http://pypi.python.org/pypi?:action=search&term=pickle&submit=search
Я особисто бачив кілька прикладів маринованих об'єктів, що надсилаються по мережі, як простий у користуванні протокол передачі мережі.
Пікінг абсолютно необхідний для розподілених і паралельних обчислень.
Скажімо, ви хотіли зробити паралельне зменшення карти за допомогою multiprocessing
(або через вузли кластера з pyina ), тоді вам потрібно переконатися, що функція, яку ви хочете мати, відображена на паралельних ресурсах, буде маринованою. Якщо він не маринує, ви не можете надіслати його на інші ресурси в інший процес, комп'ютер тощо. Також дивіться тут хороший приклад.
Для цього я використовую кріп , який може серіалізувати майже що завгодно в python. У кропу також є кілька хороших інструментів, щоб допомогти вам зрозуміти, що спричиняє збій вашої соління, коли ваш код не працює.
І так, люди використовують вибір, щоб зберегти стан обчислення, або ваш сеанс ipython , або будь-що інше.
Я використовував це в одному зі своїх проектів. Якщо додаток було закрито під час його роботи (воно виконувало тривалі завдання та обробляло багато даних), мені потрібно було зберегти всю структуру даних та перезавантажити її після запуску програми. Для цього я використовував cPickle, оскільки швидкість була важливою справою, а розмір даних був дійсно великим.
Pickle - це як "Зберегти як .." і "Відкрити .." для ваших структур даних та класів. Скажімо, я хочу зберегти свої структури даних, щоб вони були стійкими між програмами.
Збереження:
with open("save.p", "wb") as f:
pickle.dump(myStuff, f)
Завантаження:
try:
with open("save.p", "rb") as f:
myStuff = pickle.load(f)
except:
myStuff = defaultdict(dict)
Тепер мені не потрібно будувати myStuff з нуля заново, і я можу просто вибрати (le) там, де я зупинився.
Початківцю (як це буває у мене) важко зрозуміти, навіщо використовувати соління в першу чергу, читаючи офіційну документацію . Це може бути тому, що документи означають, що ви вже знаєте всю мету серіалізації. Лише прочитавши загальний опис серіалізації, я зрозумів причину цього модуля та випадки його загального використання. Також можуть допомогти широкі пояснення серіалізації, що не стосуються певної мови програмування: https://stackoverflow.com/a/14482962/4383472 , що таке серіалізація? , https://stackoverflow.com/a/3984483/4383472
Я можу вам сказати, для чого я його використовую, і я бачив, що він використовується для:
Це ті, якими я користуюсь принаймні
Я використовую маринування під час сканування веб-сайтів на одному з веб-сайтів на той час, я хочу зберігати більше 8000k URL-адрес і хочу обробити їх якомога швидше, тому я використовую маринування, оскільки його якість виходу дуже висока.
Ви можете легко дістатись до URL-адреси, і там, де Ви зупиняєте навіть ключове слово, також дуже швидко отримати деталі URL-адреси для відновлення процесу.