みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

Raspberry Pi Zero WからCloud Storageにアップロードする

www.raspberrypi.com

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は適していると思いました.