Поширені випадки використання для соління в Python


134

Я переглянув документацію соління , але не розумію, де корисний соління.

Які загальні випадки використання для соління?


2
Частина, яку я не розумію щодо маринування, - це чому просто не зберегти значення у файл? Навіщо маринувати його?
whackamadoodle3000

Відповіді:


59

Деякі використання, які я натрапив:

1) збереження даних про стан програми на диску, щоб вона могла переноситись там, де вона була відключена при перезапуску (наполегливість)

2) передача даних python через TCP-з'єднання в багатоядерній або розподіленій системі (маршалінг)

3) зберігання об’єктів python у базі даних

4) перетворення довільного об’єкта python у рядок, щоб він міг використовуватися як ключ словника (наприклад, для кешування та запам'ятовування).

З останньою є деякі проблеми - два однакових об'єкта можуть бути мариновані та призводити до різних рядків - або навіть один і той же об’єкт, зібраний двічі, може мати різні подання. Це пояснюється тим, що соління може включати інформацію щодо підрахунку.

Щоб підкреслити коментар @ lunaryorn - ніколи не слід видаляти рядок з недовіреного джерела, оскільки ретельно продуманий соління може виконувати довільний код у вашій системі. Наприклад, див. Https://blog.nelhage.com/2011/03/exploiting-pickle/


27
Не слід передавати мариновані об’єкти через мережу або інші ненадійні канали, якщо тільки мариновані дані ретельно не захищені від маніпуляцій. Документація для соління прямо застерігає, щоб ніколи не знімати дані з недовірених та несанкціонованих джерел.
місячник

4
@lunaryorn: хороший момент. Якщо ви збираєтеся передавати мариновані дані між машинами, тоді використовуйте захищений канал, наприклад, тунелювання SSL або SSH.
Дейв Кірбі

3
Тоді ви все ще довіряєте кінцевій точці, щоб не експлуатувати вас, що може бути чи не добре, залежно від контексту.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

@lunaryorn - хороший момент, але в тому випадку, як ми можемо зашифрувати дані у відкритому доступі. ми маємо вживати якусь іншу пі-ліб чи не використовувати соління
Пардіп Шарма

Чи правда точка 4)? Я знайшов, що це має деякі (старі) докази, які не працювали б тут .
salotz

10

Приклад мінімального кругового переходу ..

>>> 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

Я особисто бачив кілька прикладів маринованих об'єктів, що надсилаються по мережі, як простий у користуванні протокол передачі мережі.


8

Пікінг абсолютно необхідний для розподілених і паралельних обчислень.

Скажімо, ви хотіли зробити паралельне зменшення карти за допомогою multiprocessing(або через вузли кластера з pyina ), тоді вам потрібно переконатися, що функція, яку ви хочете мати, відображена на паралельних ресурсах, буде маринованою. Якщо він не маринує, ви не можете надіслати його на інші ресурси в інший процес, комп'ютер тощо. Також дивіться тут хороший приклад.

Для цього я використовую кріп , який може серіалізувати майже що завгодно в python. У кропу також є кілька хороших інструментів, щоб допомогти вам зрозуміти, що спричиняє збій вашої соління, коли ваш код не працює.

І так, люди використовують вибір, щоб зберегти стан обчислення, або ваш сеанс ipython , або будь-що інше.


7

Я використовував це в одному зі своїх проектів. Якщо додаток було закрито під час його роботи (воно виконувало тривалі завдання та обробляло багато даних), мені потрібно було зберегти всю структуру даних та перезавантажити її після запуску програми. Для цього я використовував cPickle, оскільки швидкість була важливою справою, а розмір даних був дійсно великим.


4

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) там, де я зупинився.


3

Початківцю (як це буває у мене) важко зрозуміти, навіщо використовувати соління в першу чергу, читаючи офіційну документацію . Це може бути тому, що документи означають, що ви вже знаєте всю мету серіалізації. Лише прочитавши загальний опис серіалізації, я зрозумів причину цього модуля та випадки його загального використання. Також можуть допомогти широкі пояснення серіалізації, що не стосуються певної мови програмування: https://stackoverflow.com/a/14482962/4383472 , що таке серіалізація? , https://stackoverflow.com/a/3984483/4383472


ваша "відповідь" - це не відповідь, це більше коментар. Питання ОП - "Які загальні випадки використання для соління?". Чи вважаєте ви, що яким-небудь чином відповіли на це питання?
Майк Маккернс

3
добре, я відчуваю, що відповів на питання, тому що у мене також були труднощі в розумінні загальної користі соління, коли я намагався прочитати про цей модуль тут , тут і тут . Тому що в основному вони починають пояснювати, що робить маринований припущення, якщо ви знаєте мотивацію, що лежить в основі всієї концепції серіалізації. Після того, як я прочитав просту статтю wiki про серіалізацію, я зрозумів загальну ідею, а також "загальні випадки". Можливо, це комусь допоможе ...
Поганий

а деякі з цих поширених випадків є…? Якщо є деякі, які тут не вказані в інших відповідях ... додати їх до своєї відповіді було б дуже доречно.
Майк Маккернс

2

Щоб додати приклад у реальному світі: Інструмент документації Sphinx для Python використовує соління для кешування розроблених документів та перехресних посилань між документами, щоб пришвидшити подальшу збірку документації.


1

Я можу вам сказати, для чого я його використовую, і я бачив, що він використовується для:

  • Ігровий профіль економить
  • Дані про ігри зберігають, як життя та здоров'я
  • Попередні записи номерів скажувань, що входять до програми

Це ті, якими я користуюсь принаймні


1

Я використовую маринування під час сканування веб-сайтів на одному з веб-сайтів на той час, я хочу зберігати більше 8000k URL-адрес і хочу обробити їх якомога швидше, тому я використовую маринування, оскільки його якість виходу дуже висока.

Ви можете легко дістатись до URL-адреси, і там, де Ви зупиняєте навіть ключове слово, також дуже швидко отримати деталі URL-адреси для відновлення процесу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.