
十分だと思えた目標
SyncGallery を作り始めたとき、私たちは明確なパフォーマンス目標を決めました。デバイスに 10 万件のメディア ファイルがあっても、アプリが高速に動作し続けることです。すべてのアルゴリズムをこの数字を前提に書き、ほぼその規模のライブラリでテストしました。
当時、10 万ファイルは十分すぎる数に思えました。毎日欠かさず 1 日 30 枚撮影しても、その数に達するには約 9 年かかります。それ以上のファイルをスマートフォンに保存する人はいないだろうと確信していました。
ユーザーが教えてくれた誤り
最初のリリースから間もなく、その前提がいかに間違っていたかを知りました。実際のライブラリは私たちの上限をはるかに超えていました。何年分ものカメラのアーカイブ、以前のスマートフォンやパソコンから移した写真、大容量のメモリーカードに保存された家族のコレクション全体。多くの Android スマートフォンは今も 512 GB、さらには 1 TB のメモリーカードに対応しており、当初の目標の何倍もの規模のライブラリを保存できます。
10 万 1 件目のファイルでアプリが突然動かなくなったわけではありません。パフォーマンスの限界は、そんなに行儀よく現れることはまずありません。実際には、一瞬で終わるはずの操作に目に見えて時間がかかるようになり、ライブラリが目標を超えて大きくなるにつれて使い心地はどんどん悪くなっていきました。最も大きなライブラリを持つ人たち、つまりおそらく最もバックアップ アプリを必要としている人たちにとって、それでは不十分でした。
規模が 10 倍になると何が変わるか
10 万ファイルでは無害な手抜きの多くが、100 万ファイルでは問題になります。パターンはいつも同じです。ライブラリの大きさに合わせて、コストが気づかないうちに増えていくのです。
- すべてをメモリに保持する。 10 万件の一覧なら RAM に余裕で収まります。その 10 倍になり、さらに画面やキャッシュの数だけ積み重なると、メモリ不足によって動作がカクつき、最悪の場合はクラッシュします。
- 一部しか変わっていないのに、すべてのファイルを確認し直す。 数枚の写真が追加されただけでライブラリ全体を調べ直しても、10 万ファイルならほとんど気づきません。100 万ファイルでは、目に見える効果のないバックグラウンド処理が何分も続くことになりかねません。
- 変更のたびに画面を更新する。 処理したファイルごとに 1 回の更新は、小さなライブラリでは気づきません。変更が何万件も一度に届くと、画面が固まってしまうことがあります。
- キャッシュを際限なく大きくする。 上限のないキャッシュは、いずれ本来高速化するはずだった画面とリソースを奪い合うようになります。
これらは珍しいバグではありません。桁がひとつ変わると通用しなくなる、ごく普通の設計判断です。
100 万ファイルに向けた作り直し
目標を 100 万ファイルに引き上げ、その数字を新しい基準としてアプリ全体を見直しました。現在、いくつかのルールが私たちの開発すべてを方向づけています:
- ライブラリが大きくなってもメモリ使用量を一定に保つ。 最も負荷の大きい一覧画面では、すべてをメモリに保持するのではなく、データベースから範囲を区切ってファイルを読み込むようになりました。大きな画像キャッシュには上限を設け、際限なく大きくなるのではなく古い項目を破棄します。この対応は画面ごとに進めている途中です。これは私たちが今後守っていく規律であり、あらゆる場所で達成済みのゴールではありません。
- 読み直すのではなく比較する。 スキャンでは、すべてを処理し直すのではなく、変わった部分を追跡します。クラウド プロバイダーが変更フィードを提供している場合は、フォルダ全体を再び一覧表示するのではなく、その変更を利用します。
- 画面をライブラリの処理待ちにしない。 重い処理は裏側でまとめて実行します。画面の更新はまとめて行うため、1 万件の変更が一度に届いても 1 万回の再描画は起きません。
- 実際のデバイスと実際のライブラリで計測する。 推測をやめ、プロファイリングに置き換えました。最大の改善は、計測しなければ決して疑わなかったような箇所から生まれました。
速さはマイルストーンではなく習慣
最も重要な変化は、個々の修正ではありませんでした。100 万ファイルという問いを、新機能を評価する方法の一部にしたことです。ライブラリが想定の 10 倍の大きさになったとき、この画面、スキャン、キャッシュはどうなるのか?
私たちがどんな数字を選んでも、誰かがそれを超えるでしょう。今度こそ、その準備を整えておきたいと考えています。
大きなライブラリをお持ちの方のために、この取り組みを行いました。もしお使いのコレクションで SyncGallery が遅いと感じたら、ぜひお知らせください。実際のライブラリは、人工的なベンチマークよりも多くのことを教えてくれます。
SyncGallery を試す
自分で管理できるクラウド同期を備えた Android 用ギャラリー アプリ。
Google Play で手に入れよう