secure code for interactive programming
DESCRIPTION
PyCon JP 2014 オープンスペースで発表。 IPython Notebookといったインタラクティブ環境用のコードをいかに安全にするか。TRANSCRIPT
Secure Code for Python Interactive Programming
PyCon JP 2014 OpenSpace 2014/9/14
@hagino3000
ここではデータ分析環境DB等の巨大なデータソースに直にアクセスできる共用IPython Notebookサーバーを想定しています。
前提
Interactive Programming
• Pros
• Powerful, Fun, Quick
• Cons
• Some dangerous (Probability of breaking production environment)
IPython Notebookからの……
突然の死• 大量のデータをロードしてしまいスワップアウト
• DB、ネットワークに負荷をかける
• 重い処理を放置
• CPUに負荷をかけてしまい監視にひっかかる
• なにげなくファイルに保存したらDisk Full
回避したい
• インフラの人におこられる
• データ回収の遅延
• データロスト & 再送処理の手間
運用と設計でなんとかしよう
• インタラクティブ環境向けのショートカットメソッド(データロード)
• 省メモリな実装
• 人間の怠惰さ、ミスを想定した設計
• 共用IPython Notebookサーバの運用
省メモリ
• とにかくgeneratorを返す
• DBフルスキャンする様なコードを実行していたとしても、generatorが帰ってきた時点ではセーフ
• 正しく扱えばよい
generatorのチェーン例def invoke(file_name, db_name):! db = MongoClient(‘localhost’)! db.events.insert(convert(parse(readline(file_name))))!!def readline(file_name):! with gzip.open(file_name) as input:! for line in input:! yield line!!def parse(lines):! for line in lines:! yield json.loads(line)!!def convert(rows):! for row in rows:! yield {…(略)…}
メモリ使用量のチェック
@profile!def readline(file_name):! with gzip.open(file_name) as input:! for line in input:! yield line
$ pip install memory-profiler $ pip install psutil からの
指定したメソッドの行ごとに使用量が出せる
大量のオブジェクトの扱い
• __slots__ 使っておく
• 属性の少ないクラスを扱う場合は有効
人間は怠惰• とりあえずパラメータ無しで実行とかしがち
• 絞り込み条件無しで実行すると全データフェッチするような設計だと死ぬ
• 例えば生ログを取ってくる様なメソッドの場合は期間を必須にする
• 期間の最初だけ指定されたら??
人間は怠惰
• docコメント書いておく
• mymodule.load_data? でいつでも参照できる
Notebook Serverの運用
• 1日一回再起動
• CPU、メモリ使用量は不定期に暴れる
• 起動ユーザーは権限小さめが良い
• インフラの人には大丈夫だと言おう
Enjoy Interactive Programming