はじめに
Pythonで開発しているタブ型・プレビュー付きのファイル検索アプリ「FileSearchExplorer」、前回の記事ではv0.7.1で検索そのものの体感速度を底上げした話をご紹介しました。
今回のv0.7.2は、検索機能そのものには手を入れていません。その代わり、「アプリを開いてから使えるようになるまで」の裏側の重さを見直したアップデートです。地味ですが、毎回のことなので効果はじわじわ効いてきます。
GitHubリポジトリはこちら:
https://github.com/Unknown777hello/FileSearchExplorer
v0.7.2での主な進化ポイント
インデックスDBの初期化・復号を「実際に使う瞬間」まで遅延
これまでは、アプリを起動するとバックグラウンドで毎回、暗号化されたインデックスDBの復号とSQLiteのスキーマ確認を行っていました。インデックス検索を一度も使わないまま普通のフォルダ検索だけで作業を終える日でも、このDB処理は必ず走っていたことになります。
v0.7.2では、この初期化処理を「インデックス検索を実行したとき」または「インデックス管理画面を開いたとき」まで遅らせるようにしました。画面はDB処理を待たずにすぐ表示され、インデックス機能を使わない限りDBには一切触れません。実際にインデックス検索を選んだ瞬間だけ、「インデックスを準備しています…」という表示とともに一度だけ初期化が走ります。
データベース整合性チェックを「条件付き」に変更
起動のたびにPRAGMA integrity_checkでDB全体をチェックしていたのですが、これはファイル件数が多いほど地味に時間のかかる処理です。よく考えると、毎回フルチェックする必要は本来ありません。
そこで、整合性チェックを実行するタイミングを次の条件に絞りました。
- アプリの初回起動時
- 前回のセッションが異常終了だった場合
- インデックス管理画面から手動で「データベースを修復」を実行した場合
- 上記に当てはまらなくても、前回チェックしてから概ね1か月以上経過している場合
「前回異常終了したかどうか」は、終了時に正常終了フラグを記録しておき、次回起動時にそのフラグが立っていなければ「前回落ちた」と判断する、という単純な仕組みで実現しています。普段の起動では、テーブルの存在確認程度の軽い処理だけで済むようになりました。
重いライブラリの遅延読み込み
暗号化に使うcryptography、画像プレビューに使うPillow、デスクトップ通知に使うplyerは、これまで起動時に一括でimportしていました。使う機能を一つも使わない起動でも、律儀に全部読み込んでいたことになります。
v0.7.2からは、それぞれ「暗号化処理を行う直前」「プレビューを表示する直前」「デスクトップ通知を送る直前」まで読み込みを遅延させています。一度読み込んだ後はキャッシュされるので、2回目以降のコストはこれまで通りです。
開発の裏話
今回、一番気を使ったのは「遅延させた分、後からこっそり失敗しないか」という点でした。
例えばアプリを閉じるとき、インデックスDBが「今まさに初期化中」だったり「バックグラウンドでインデックス作成中」だったりすると、その途中でDBファイルをそのまま暗号化してしまい、DBが壊れる危険があります。今回、初期化そのものを遅延させたことで、終了処理側でも「初期化がまだ進行中かどうか」を新しく待ち受ける必要が出てきました。既存の「書き込み中は待つ」という仕組みに、「初期化中は待つ」という条件を一つ追加する形で対応しています。
もう一つ悩んだのが、「前回異常終了したかどうか」をどう判定するかでした。DBの中にフラグを持たせる案も考えたのですが、DB自体が壊れている可能性がある状況で判定したいので、DBとは独立した小さな状態ファイルに正常終了フラグだけを持たせることにしました。起動直後にまずこのフラグを「起動中」に書き換えておき、正常に終了できたときだけ「正常終了」に書き戻す、という単純な仕組みですが、これでDBの状態に関係なく前回の終了状況を判定できるようになっています。
最後に(WindowsならPython不要で動きます)
今回もPython環境がないPCでも、Windows環境(10/11 64bit)ならReleasesからzipをダウンロードするだけでそのまま単体で動きます。
見た目の変化はほぼ皆無なアップデートですが、「毎回の起動が地味に軽くなる」というのは、使い続けるアプリとしてはむしろ大事な部分なんじゃないかと思っています。
バグ報告や「こんな機能が欲しい!」といったフィードバックは、引き続きGitHubのIssuesでお待ちしています。ぜひスターもポチッとお願いします!
最新版のダウンロード(Releases):
https://github.com/Unknown777hello/FileSearchExplorer