アフィリエイト広告を利用しています

広告

posted by fanblog

2021年04月02日

【TIPS】python:pickle

pythonで変数をファイルに保存
 pickle モジュールは、pythonオブジェクトの直列化(serialization)、および直列化されたオブジェクトの復元のためのバイナリプロトコルが実装されている。
シリアル化
 データ構造をネットワーク上で格納または転送できる直列形式に変換する方法です。
 pythonでは、シリアル化を使用することで、複雑なオブジェクト構造を取得し、ディスクに保存したり、ネットワーク経由で送信できるバイトストリームに変換できます。このプロセスはマーシャリングとも呼ばれています。逆のバイトのストリームを取得して、データ構造に変換する処理は、逆シリアル化もしくはアンマーシャリングと呼ばれます。
pickle可能タイプ

 シリアル化のもっとも一般的な用途は、機械学習のトレーニングフェーズ後に、トレーニング状態を保存して、後でトレーニングをやり直すことなく使用できるようにすることです。
 pythonでは、オブジェクトをシリアル化・逆シリアル化できる3つのモジュールが標準ライブラリとして用意されています。
  • marshal:3つの中でもっとも古いモジュール。非推奨
  • json:標準のjsonファイルを操作可能。人が読みやすく言語に依存しない。XMLよりも軽い。
  • pickle:バイナリ形式でオブジェクトをシリアル化するため、人が読み取りできない。その一方で高速で様々なpythonで動作する。
どのモジュールを選択すべきかは、ユースケースに依存する。
 jsonおよびXMLは、異なる言語との相互運用や人が読む必要がある場合に適した選択肢である。pickleは、pythonのみで利用する場合や人が読む必要のない場合に適した選択肢である。
pickleモジュール
 4つのメソッドで構成されています。
  1. pickle.dump(obj, file, protocol=None, *, fix_imports=True, buffer_callback=None)
  2. pickle.dumps(obj, protocol=None, *, fix_imports=True, buffer_callback=None)
  3. pickle.load(file, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None)
  4. pickle.loads(data, /, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None)
 最初の2つはシリアル化の時に利用されます。
pickle可能
 すべてが漬け込み可能であるとは限りません。不可能なオブジェクトは、データベース接続やネットワークソケット、実行中のスレッドなどです。
 回避策としては、サードバーティ製のdillやcloudpickleライブラリを使用することで回避できる可能性があります。このモジュールは、関数の関数など多くの方をシリアル化できます。
pickleオブジェクトの圧縮
 データ形式はオブジェクト構造のコンパクトなバイナリ表現ですが、bz2モジュールで圧縮することで、最適化できます。
セキュリティ上の懸念
 アンピックプロセスで任意のコードを実行することができます。このリスクを軽減するために何が出来るでしょうか??
 完璧な回避策はありません。経験則として、信頼されていないソースから来たデータや安全でないネットワークを介して送信されるデータを利用しないことです。中間者の攻撃を防ぐために、データに署名して改ざんされていないことを確認するhmacライブラリをすることをお勧めします。
まとめ
 pickleモジュールを利用することで、オブジェクトを保持することができるようになるでしょう。
この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/10637907
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック
検索
<< 2022年06月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
最新記事
タグクラウド
カテゴリーアーカイブ
日別アーカイブ
×

この広告は30日以上新しい記事の更新がないブログに表示されております。