ダイエットをすると軽くなるのか?(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 を使う。
どちらもたいして減らない。
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 で登録した favicon はData 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 の動きが軽くなるかもしれない。
使ったツールはこちら。
- http://sqlitebrowser.org/ ――― DB Browser for SQLite
- http://sqlite.org/download.html ――― SQLite
片方だけでも良いし、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 のアドオンなんて作ってられんみたいな。
使えてるんだけどなあ...