Ограничения python pickle? Может ли он сериализовать что-нибудь?

#python #pickle

#python #pickle

Вопрос:

Я пишу небольшой модуль, который должен иметь возможность сохранять что-либо на диск.

Я не знаю заранее, какие данные будут в переменной, поэтому мне нужна функциональность по умолчанию, которая может сериализовать ЧТО-ЛИБО на диск.

Я полагаю, что pickle — лучшее, что можно использовать в этом случае, потому что он может сериализовать объекты python на диск, и все является объектом в python.

 def to_binary(self, folder: str):
    import os
    import pickle
    os.makedirs(folder, mode=0o777, exist_ok=True)
    with open(os.path.join(folder, self.name), mode='wb') as f:
        pickle.dump(self.data, f)                      
        
def from_binary(self, folder: str): 
    os.makedirs(folder, mode=0o777, exist_ok=True)
    with open(os.path.join(folder, self.name), mode='rb') as f:
        self.data = pickle.load(f)
  

Честно говоря, я не уверен, каковы его ограничения. похоже, я мог бы использовать это для записи словаря на диск, строки, чего-нибудь ванильного python. Но как насчет других объектов? как фрейм данных pandas? (конечно, у этого есть встроенные способы сохранения на диск, но все же, будут ли мои материалы подавляться объектом DataFrame только в качестве примера?)

Знаете ли вы что-нибудь, что могло бы это нарушить? Если да, есть ли еще более общее решение для сохранения данных на диск?


Примечание стороны, еще одна причина, по которой я мог бы захотеть использовать это, — это для целей «хеширования». Если я получу объект, который не является хешируемым, теоретически я мог бы использовать pickle для получения потока символов, который является хешируемым. Пока процесс его сериализации является детерминированным, этого должно быть достаточно для моих целей. Если вы видите какие-либо проблемы с этой вспомогательной проблемой, пожалуйста, дайте мне знать.

Такого рода вещи проникают в гораздо более глубокие концепции информатики, чем я действительно понимаю, поэтому я действительно ценю вашу помощь!

Комментарии:

1. Конечно, сериализация чего -либо — это то, что должны уметь делать pickles, но это звучит как рецепт плохого дизайна, а хеширование звучит еще хуже (травление не обязательно должно быть детерминированным). Что это такое, что требует сериализации абсолютно всего на диск? Что, если сериализуемое зависит от процесса или состояния процесса?

2. «Сериализовать ЧТО-ЛИБО» на самом деле не имеет смысла — не каждый объект представляет то, что имеет смысл сериализовать. Не существует 100% общего механизма сериализации абсолютно любого объекта.

3. @Ry- Я хочу как можно более обобщенное решение для моего базового класса, я думаю, что оно будет использоваться в качестве последнего средства, поскольку у многих вещей есть лучшие способы сохранить свои данные на диске. Таким образом, сериализация на диск почти всегда будет очень контекстуальной в этой системе, но я хотел, чтобы стандартное решение использовалось, если конкретное решение еще не доступно. также спасибо за комментарий по хешированию pickle. прямо сейчас у меня есть решение для временных меток, но хеширование было бы идеальным, я думаю, я просто не могу найти решение, позволяющее что-либо хэшировать, и я думаю, что pickle — это тоже не то. Спасибо!

Ответ №1:

По моему опыту, библиотека tensorflow имеет некоторые проблемы с наличием объектов, не поддающихся обработке. См., Например, Эту проблему с github.

На самом деле я не знаю, откуда именно эта проблема, но это определенно отрицательный пример.