ダイエットをすると軽くなるのか?(Firefox の話)

重い。
ひたすら Firefox が重い。
タブを閉じたときにぴたっと固まる。

はてなスクリーンショットが動かなくなったとか騒いでたのだけれど、元々は Firefox が重たくって 64bit 版にしたら解消できるのかも、とか、そういうところから始まってたのだった。

ふりかえり

一度は通った道

タブを閉じたときの状況をタスクマネージャーで見ると、CPU は 50% で張り付いたまま(core × 2 なので、実質 使いきってる)。

タブを閉じるときに顕著に重たくなるので、「履歴を残す」とか、「セッションや閉じたウィンドウを残す」とか、そういう処理が引っ張っているんだろう、とは思ってる。
I/O は上がらないけど、特定の svchost.exe なども CPU を使いまくってるので、アンチウィルスソフトに巻き込まれているんだろう。

以前、手違い(とまでは言わないけど)places.sqlite を削除したら、しばらくは軽い状態が続いていたような気がする。
また、ダイエットだな。

places.sqlite

places.sqlite というファイルはアクセスの履歴なんかを抱えているので、使っているうちにどんどん大きくなる。
消せば軽くなるよ、という話はあちこちで見られるのだけれど、ちょっと不便なことも。

  • Bookmark を消失する可能性がある
  • Bookmark Favicon Changer というアドオン(AMO から消えている...)の設定の一部がリセットされる

64bit 版を使い始めるときに、バックアップをミスって places.sqlite がおかしくなってしまったときには、古いバックアップから favicon の情報をサルベージしたのだけれど、これがまた微妙に面倒で、何度もやりたいような作業ではない。

というわけで、今回はきちんとダイエットしようと思ったのだ。

さあ、ダイエットだ

まずは、VACUUM

プロファイルの配下で、でかいファイルはふたつ。

まずは、問題があまりなさそうなテーブルの VACUUM から。
SQLite Browser の Compact Database を使う。

  • webappsstore.sqlite ――― 74,708,992 → 73,506,816
  • places.sqlite ――― 43,319,296 → 40,599,552

どちらもたいして減らない。
VACUUM によるダイエットは、削除を頻繁に繰り返すようなテーブルじゃないと効果はない。
そもそも、レコード数が多いのが問題なのだ。

レコード数の確認

places.sqlite に含まれるテーブルのレコード数を確認する。
SQLite の sqlite3.exe を使う(SQLite Browser でもできる)。

>sqlite3 places.sqlite
SQLite version 3.8.11.1 2015-07-29 20:00:57
sqlite> select name from sqlite_master where type = 'table';
moz_places
moz_historyvisits
moz_inputhistory
moz_hosts
moz_bookmarks
moz_bookmarks_roots
moz_keywords
sqlite_sequence
moz_favicons
moz_anno_attributes
moz_annos
moz_items_annos
sqlite_stat1

select count をするだけのスクリプトを作る >count.sql

select count(*) from moz_anno_attributes ;
select count(*) from moz_annos ;
select count(*) from moz_bookmarks ;
select count(*) from moz_bookmarks_roots ;
select count(*) from moz_favicons ;
select count(*) from moz_historyvisits ;
select count(*) from moz_hosts ;
select count(*) from moz_inputhistory ;
select count(*) from moz_items_annos ;
select count(*) from moz_keywords ;
select count(*) from moz_places ;
select count(*) from sqlite_sequence ;
select count(*) from sqlite_stat1 ;

sqlite3.exe にもどる。

sqlite> .read count.sql
15
1763
2251
5
4324
94353
6268
91
446
1
58485
1
15

テーブル名が表示できないのは、ちょっとだけ不便。

テーブル レコード数
moz_anno_attributes 15
moz_annos 1763
moz_bookmarks 2251
moz_bookmarks_roots 5
moz_favicons 4324
moz_historyvisits 94353  (★)
moz_hosts 6268
moz_inputhistory 91
moz_items_annos 446
moz_keywords 1
moz_places 58485  (★)
sqlite_sequence 1
sqlite_stat1 15

レコード数が極端に多い、moz_historyvisits と moz_places がダイエットの候補。

ダイエットの方針

履歴は諦める。
moz_historyvisits は全削除。

問題は、moz_places 。
他のテーブルと関連がある。
moz_places は、moz_favicon や moz_bookmark とリンクしている。

    moz_favicon.id = moz_places.favicon_id
                     moz_places.id         = moz_bookmarks.fk

moz_favicon は、Bookmark Favicon Changer というアドオンが、手動でファイルを関連付けたときにデータを書き込んでいるので、バッサリと消すわけにもいかない。

Bookmark Favicon Changer の設定を残しつつ、moz_places のレコードを減らす。

moz_places で消せるレコードの確認

Bookmark Favicon Changer で登録した faviconData URI schemeで画像を持っている。
moz_favicon.url が data: で始まっているもの以外を moz_places から消してしまえば良いんだろう。

favicon を置き換えた(かもしれない)places。

select count(*) from moz_places
    where
        favicon_id in (select id from moz_favicons where url like 'data:%')

→ count:38

favicon を置き換えてない(であろう)places。

select count(*) from moz_places
    where
        not favicon_id in (select id from moz_favicons where url like 'data:%')

→ count:44503

待て待て。

38 + 44503 = 44541  != 58485 (count(*) from moz_places)

favicon には、chrome: というパターンもあるのか。
いや、1件だけだ。
moz_places.favicon_id = NULL というのがあるんだ。

select * from moz_places where favicon_id is NULL

→ count:13944

44503 + 38 + 13944 = 58485

OK!
数は合ってる。

削除候補のレコードの内容を確認。

select * from moz_places
    where
        favicon_id is NULL or
        not favicon_id in
            (select id from moz_favicons
                where url like 'data:%' or url like 'chrome:%')

→ count:58446

あー、これだと place: なんてのがが引っ掛かる。
moz_places.url を全件 抜き出して、: 以降を消して、sort -u 。

about:
file:
ftp:
http:
https:
javascript:
place:

place: と about: は、残した方が良さげ。

さあ、ダイエット

というわけで、ダイエットの SQL

delete from moz_places
    where
        not favicon_id in
            (select id from moz_favicons where url like 'data:%' or url like 'chrome:%')
delete from moz_places
    where
        favicon_id is NULL and
        not url like 'place:%' and not url like 'about:%'
delete from moz_historyvisits

レコード数の確認。

select count(*) from moz_places

→ count:50

で、vacuum 。

  • places.sqlite ――― 43,319,296 → 40,599,552 → 40,599,552

あれ、減らないなあ...
あ、sqlite3.exe でファイルをつかんでた。
あらためて valuum 。

  • places.sqlite ――― 43,319,296 → 40,599,552 → 5,406,720

で、Firefox を再起動。
about:newtab の中身がデフォルトっぽい感じに。まあ良い。
ん、bookmark toolbar が真っ白だ。

places.sqlite を元に戻す。
Bookmark Favicon Changer の効果が消えてる。
まさか、vacuum のせいか?

places.sqlite_conflict(ファイル名は、うろ覚え)なんてのができている。

ちくしょう、バックアップから元に戻して、もう一度だ。
ああ、やっぱりブックマークツールバーが見えん。
ctrl + shift + B の「履歴とブックマークの管理」では見えているのだけれど。

ちくしょう、ちくしょう。

# 実は、バックアップもミスってるし、conflict は sqlite3.exe と SQLite Browser の両方を起動してたのが原因

仕切り直し

しかたがない。
ひとつずつ確認だ。

バックアップがミスってるっぽいので、Developer Edition の places.sqlite を持ってくる。

delete from moz_historyvisits

これは OK 。

bookmark の表示がおかしくなるということは、moz_bookmark の絡みか。
moz_bookmark → moz_place の参照が切れているのがまずいのか。

削除対象で、moz_bookmark から参照されている件数を確認。

select * from moz_places
    where
        not favicon_id in
            (select id from moz_favicons where url like 'data:%' or url like 'chrome:%') and
        id in (select fk from moz_bookmarks where not fk is NULL)

→ count:282

select * from moz_places
    where
        favicon_id is NULL and
        not url like 'place:%' and not url like 'about:%' and
        id in (select fk from moz_bookmarks where not fk is NULL)

→ count:1630

結構ある。
こいつらを、削除対象から外してみよう。

delete from moz_places
    where
        not favicon_id in
            (select id from moz_favicons where url like 'data:%' or url like 'chrome:%') and
        not id in (select fk from moz_bookmarks where not fk is NULL)
delete from moz_places
    where
        favicon_id is NULL and
        not url like 'place:%' and not url like 'about:%' and
        not id in (select fk from moz_bookmarks where not fk is NULL)

レコード数は、 56767 → 1959。


Firefox 起動!
よっしゃあ。
bookmark toolbar もきちんと表示されているし、Bookmark Favicon Changer の効果も効いている。

Firefox を閉じて、places.sqlite を vacuum 。
41,943,040 → 5,931,008

多少は軽くなった気がする。
はてなブログのような、広告とかやらなんやらに ドカドカ リクエストを出しまくるページの表示も、表示までの時間が短くなったような。

まとめ

プロファイル配下の places.sqlite は、どんどん大きくなるファイル。
ダイエットすることで、多少は Firefox の動きが軽くなるかもしれない。

使ったツールはこちら。

片方だけでも良いし、Firefox のアドオンでも同じことができるものが公開されている。

ダイエットの SQL

ダイエットの SQL は、以下の三つ。

delete from moz_historyvisits
delete from moz_places
    where
        not favicon_id in
            (select id from moz_favicons where url like 'data:%' or url like 'chrome:%') and
        not id in (select fk from moz_bookmarks where not fk is NULL)
delete from moz_places
    where
        favicon_id is NULL and
        not url like 'place:%' and not url like 'about:%' and
        not id in (select fk from moz_bookmarks where not fk is NULL)

副作用

分かってる副作用は、以下の二つ。

  • 履歴が消えます。きれいさっぱり。
  • 新規にタブを開いたときの中身が消えます。

履歴を残したければ、moz_historyvisits.visit_date で除外すれば多少は何とかなるかも。

「新規にタブを開く」の url は about:newtab 。
積極的に使うことはないと思うし、使ってるうちに元に戻ります(多分)。

その他

moz_hosts

moz_historyvisits と moz_places に続いてレコード数が多かった moz_hosts 。
アクセスしたことがあるホストを記録しているらしい。
host は分かりやすいとして、frecency ってなんだ。
まさか、frequency の typo ではなかろう。

Frecency はブックマーク、履歴、タグを包含する Places の中で個別の URI に与えられるスコアです。このスコアは再訪問数、訪問のタイプ、どれくらい新しいか、URI がブックマークまたはタグ付けされているかによって決定されます。

"frecency" という用語は "frequency" と "recency" による造語です。

https://developer.mozilla.org/ja/docs/The_Places_frecency_algorithm

moz_hosts.id は、他のテーブルから参照されているんだろうか。
ダイエットのついでに消しちゃったんだけど、それなりに動いてる。

http://forums.mozillazine.org/viewtopic.php?f=38&t=2346371
なるほど、アドレスバーでのホスト名補間なんかに使われているのか(それだけとは限らないけど)。

お、起動時に SQLite なファイルへの書き込みを行うコード。
インストールディレクトリの defaults 配下のファイル。
これは、覚えておくと良いことがあるかもしれない。

プロファイルはバックアップを取るべき

設定の変更やアドオンの追加など、ほぼ全てがプロファイル配下に保存されている。
デフォルトのままではなくて、プロファイルディレクトリを指定して、何かある度にバックアップ。
面倒なようだけど、結構、救われることあります。
# 実は、今回も一度ミスってるのだけれど :-)

Bookmark Favicon Changer

これを書いてて気が付いたのだけれど、AMO から消えている。
良い感じなのになあ。

http://forums.mozillazine.org/viewtopic.php?f=19&t=2692679
まさかの、作者 ギブアップ。
さらに、Firefox のアドオンなんて作ってられんみたいな。

使えてるんだけどなあ...