jupyter notebook からソースコードだけを抽出する方法

jupyter notebook からソースコードだけを抽出する方法です

2行でまとめると

  • nbconvertを使う方法が定番.でも動作が遅い
  • 20倍以上高速な jq を使う方法がおすすめ

となります.以下,詳細です.

nbconvert を使う方法

input.ipynb からpythonコードを取り出して test.py に保存する場合は以下のコマンドを実行します.

$ jupyter nbconvert --to script input.ipynb  --output test

jq を使う方法

上述の nbconvert は高機能ですが,動作が遅いです.nbconvertはpythonで記述されているためです.

別解として jq を使う方法があります.

$ jq -j '.cells  | map( select(.cell_type == "code") | .source + ["\n\n"] )  | .[][]'   < input.ipynb > test.py


こんなコード,毎回入力できませんね.シェルスクリプトにします

ipynb2py.sh

#!/bin/sh

if [ -z "$1" ]; then
	echo "usage:"
	echo "    $0  input.ipynb"
	exit 1
fi

cat $1 | jq -j '.cells  | map( select(.cell_type == "code") | .source + ["\n\n"] )  | .[][]'   

この内容を ipynb2py.sh という名前で保存します. ipynb2py.sh はPATHが通ってるディレクトリに配置しましょう.これで簡単にjq が利用できます.

ipynb2py.sh の使い方

ソースコードを変換するなら

$ ipynb2py.sh  input.ipynb > test.py

ソースコードをちょっとみるだけなら

$ ipynb2py.sh  input.ipynb 

コードが長い場合は

$ ipynb2py.sh  input.ipynb  | lv

などと実行できます.

jq はどれくらい速いのか?

MacBook(M1)で実行時間を計測しました

nbconvert の場合

real	0m1.221s
user	0m0.845s
sys	0m0.186s

jq の場合

real	0m0.049s
user	0m0.037s
sys	0m0.010s

jq の方が20倍以上高速でした.

ソースコードを見るだけの用途で考えると,1秒以上掛かる nbconvert は処理がもたつくと感じます.個人的には jq 一択です.

RRDCached の使い方

RRDtool を高速化する rrdcached の使い方

RRDcached とは

RRDcached は RRDtool のためのキャッシュサーバーです.

RRDtool は加速度や湿度センサーの値,サーバーのCPU負荷,パケット数,と言った時系列データに特化したデータベースです.RRDtoolだけでもかなり便利ですが,さらに RRDcached と組み合わせると,

  • RRDtoolの高速化
  • sdカードやSSDに対する書き込み回数を削減する効果

が期待できます.

特に後者の効果が重要で,例えば,ラズパイベースのフィジカルコンピューティングで何も考えずにセンサデータを逐次 sdに書き込んでいると,sdカードはすぐに書き込み寿命に達します.こういう時は rrdtool + rrdcached の構成が一つの解決策になります(別解は tmpfs のようなRAMディスクを使う方法)

インストール

$ sudo apt install rrdcached

設定ファイル

/etc/default/rrdcached

デフォルト設定は以下の通り

  • データを保持するディレクトリ /var/lib/rrdcached
  • データベースの実態を保存するディレクトリ /var/lib/rrdcached/db
  • データベースのジャーナルを保存するディレクトリ /var/lib/rrdcached/journal
  • 通信用のソケット /var/run/rrdcached.sock

アクセス制限(簡便な方法)

アクセス制限はファイルのパーミッションで行う(他の方法は設定がめんどくさいので無視)

デフォルト設定では,キャッシュサーバーとなる /usr/bin/rrdcached は root ユーザで起動している.

この設定は /etc/default/rrdcached の以下の記述に従っている.

# Optional unprivileged group to run under when daemon.  If unset
# retains invocation group privileges.
#DAEMON_GROUP=_rrdcached

# Optional unprivileged user to run under when daemon.  If unset
# retains invocation user privileges.
#DAEMON_USER=_rrdcached

クライアント側は /var/run/rrdcahced.sock 経由でキャッシュサーバと通信をする

以上を踏まえて,アクセス制限は以下の2ファイルのパーミッション,owner を調整すれば良い

使い方

使い方: データベースの作成

/var/lib/rrdcached/db 以下に rrdファイルを用意するだけ

使い方:データベースへのアクセス

rrdtool のオプションで以下の二つを指定する

  • 通信用のソケット /var/run/rrdcached.sock
  • データベースのファイル名 /var/lib/rrdcached/db/データベースのファイル名

例えば

$ rrdtool fetch /var/lib/rrdcached/db/hogehoge.rrd AVERAGE 

を rrdcached 経由で実行するなら

$ rrdtool  fetch --daemon unix:/var/run/rrdcached.sock /var/lib/rrdcached/db/hogehoge.rrd  AVERAGE

と"--daemon ソケット" を付与すればよい

動作確認

rrdtool info を実行すると良い

$ rrdtool  info --daemon unix:/var/run/rrdcached.sock /var/lib/rrdcached/db/hogehoge.rrd