Raspberry Pi Zero Wとは,2000円程度で購入できる,以下の性能のシングルボードコンピュータです.
- 802.11 b/g/n wireless LAN
- 1GHz, single-core CPU
- 512MB RAM
CPUはARMv6で,WiFiも搭載しているため,pythonの実行結果をGoogle Cloud Storageにアップロードする,という用途で使用できそうな気がしたので,試してみました.
結論から申し上げると,少し工夫をすれば実用的な速度で動作しました.
gsutilコマンドが遅い
まずは気軽にgsutil
コマンドを使用してアップロードを試みることにしました.Raspberry Pi OS 32 bitを準備したmicroSDを用意して,Raspberry Pi Zero Wを起動し,ターミナルからCloud SDKを以下に従ってインストールしました.ありがたいことにdebian armv6 に対応しているので簡単です.
Install the gcloud CLI | Google Cloud
適当にCloud Storage bucket raspberry-pi-zero-test-bucket
を作成し,4byteのテキストファイル test.txtを以下のコマンドでアップロードしてみました.
gsutil cp test.txt gs://raspberry-pi-zero-test-bucket
実行するのに50秒かかりました.あまりに遅いので原因を探ることにしました.試しにgcloud
コマンドを,引数なしで実行したところ20秒かかりました.Cloud SDKのコマンドは,Raspberry Pi Zero Wで実行するには重すぎる印象です.
Cloud Storage Python APIを試す
Upload objects | Cloud Storage | Google Cloud
上記ドキュメントによると,gcloud
コマンド以外にもアップロードする方法があるようなので,Cloud Storage Python APIを試してみることにしました.
Storage Client — google-cloud-storage documentation
試しにpythonで以下のスクリプトを実行してみました.
from google.cloud import storage
Cloud Storageのライブラリを読み込むだけですが,8秒かかりました.この間CPU使用率は100%でした.この処理は必須なので,これ以上の高速化は断念しました.
ただし,以下のアップロードする部分はほぼ一瞬で完了することが分かりました.
blob.upload_from_filename(path)
したがって,Raspberry Pi Zero Wのスペックでもアップロード処理は十分可能ですが,Cloud Storageにアクセスするための初期化と認証はとても時間がかかるので,工夫が必要でした.
Cloud Storageにアップロードする処理をデーモンにする
ファイルをCloud StorageにアップロードするたびにCloud Storageのライブラリを読み込む設計では,CPUを無駄に使用してしまうので,起動時にCloud Storageのライブラリを読み込んで,指定したディレクトリを監視し,ファイルが追加されたらCloud Storageにアップロードする方法を試すことにしました.
上記内容のスクリプトをPythonで作成し,デーモンにしてサービスとして自動実行されるようにしました.なお,実際のPythonスクリプトは,みーの個人的なプロジェクトに依存しているので,掲載は控えさせていただきます.
これにより,指定したディレクトリにファイルを出力すれば,数秒後にはCloud Storageに反映されるようになりました.
ファイルをRAMに保存する
大きなファイルをmicro SD カードに保存すると,読み書きが遅くなるので,RAMに保存するように工夫します.Raspberry PI ZeroのRAMの容量は512MBなので,半分の256MBを割り当てることにします./etc/fstab に以下を追加して再起動します.
tmpfs /tmp tmpfs defaults,noatime,size=256m 0 0
ファイルシステムを確認します.
$ df -h Filesystem Size Used Avail Use% Mounted on /dev/root 7.1G 2.5G 4.4G 36% / devtmpfs 87M 0 87M 0% /dev tmpfs 215M 0 215M 0% /dev/shm tmpfs 86M 648K 86M 1% /run tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 256M 0 256M 0% /tmp /dev/mmcblk0p1 253M 50M 203M 20% /boot tmpfs 43M 0 43M 0% /run/user/1000
あとは,/tmpのサブディレクトリにファイルが保存されたらCloud Storageにアップロードされるように設定すれば完了です.
まとめ
Raspberry Pi Zero Wのスペックでも,Cloud Storageの初期化と認証を最初に1度だけ実行するようにし,出力ファイルをRAMに保持してからアップロードするように工夫することで,継続してCloud Storageにファイルをアップロードできることが分かりました.
ネットワークで処理が可能な温度計や監視カメラなどを安価に作成するのにRaspberry Pi Zero Wは適していると思いました.