Firefox Hacks 翻訳日記

アクセスカウンタ

zoom RSS places.sqlite の再作成

<<   作成日時 : 2009/02/05 13:50   >>

トラックバック 4 / コメント 0

去年の6月18日に Firefox 3 がリリースされてから半年以上。
今さらではあるが、places.sqlite が肥大化していることに気付いた。
デフォルトのプロファイルの方は、たかだか 4.1M なので面倒なら放置できるサイズなのだが、
サブでネットゲーム用に使っているプロファイルの方は 30M になっていた。
道理で最近、起動に時間がかかる筈だ。

というわけで、肥大化した places.sqlite を何とかするためのノウハウを調べてみた。
断片的な知識はネットのそこここに転がっているのだが、まとまった記述はないように思えるので、
小生なりのまとめ、という事で。
なお、例によって誤解・誤読による誤りもあると思われるので、ご指摘いただければ幸い。
あと、「places.sqlite って何?」とか「プロファイルフォルダってどこ?」とかまでは解説しないので念の為。

A. 基礎知識



1. なぜ places.sqlite は肥大化するか

仕様である。

SQLite Home PageSQLite Frequently Asked Questions より引用。

(12) I deleted a lot of data but the database file did not get any smaller. Is this a bug?

No. When you delete information from an SQLite database, the unused disk space is added to an internal "free-list" and is reused the next time you insert data.

データベースからどんなにデータを削除しても、データファイルのサイズは小さくならないのである。
空いた部分は、次にデータが追加されるときの為に保持される、というわけだ。
ファイルを小さくするためには、明示的に VACUUM コマンドを使用しなければならない。

「だったら、定期的に places.sqlite を VACUUM すればいいだろうが。Firefox の開発者は何を(略」
と言う声もあろうが、どうやら VACUUM を実行している間はブラウズできないとか、
VACUUM 後にデータを追加する時のパフォーマンスの問題で、
現状では VACUUM はサポートされていない。
VACUUM を実装しよう、というバグはすでに立っている。
Bug 403702 – add "Compact" to "Organize" menu in the bookmarks organizer that does VACUUM (with progress)

2. VACUUM の効果

ファイルサイズが半分以下になった (べつになんでもないこと) という報告もあるが、
約10% しか縮小されず、体感速度も変化なかった (雑木林とコンピュータのメモ帳) という報告もある。
小生の環境では、30M → 27M、4.1M → 3.8Mと、やはり約10% の縮小だった。
この程度の圧縮ならプラシボ効果の範疇だろう。

なお、Windows で VACUUM するには;
 a). SQLite の Precompiled Binaries For Windows (コマンドラインツール) を入れる。
 b). Firefox の拡張機能 SQLite Manager を入れる。
 c). PupSQLite などの SQLite 管理ソフトを入れる。
のいずれかが必要。

SQLite Manager は現時点で日本語化されていないので、
英語にアレルギーのある人は、国産の PupSQLite の方が良いかもしれない。
moz_favicons の内容が画像表示できる、というメリットもある。
ただし、少なくとも GUI からは reindex できないと思われる。

3. 再作成した方が良い場合

・places.sqlite が 2〜3M 以上に肥大化している。
・できるだけファイルサイズを小さくしたい。
・新しいソフトや拡張機能を入れたくない。
・履歴が消失してもしばらくの間なら我慢できる。

これらの条件に該当する人は、試してみて損はないだろう。
どれくらいファイルサイズが小さくなるかと言えば、30M → 580K、4.1M → 560K だった。
(再作成後のファイルサイズは、ブックマークの数と、favicon をリストアするかどうかに依存する)
当然の事ながら体感的な起動速度も早くなった (ような気がする) し、
終了直後にもう一度起動しても「Firefox は起動していますが応答しません」が出にくくなった。

あと、小生の環境だけかもしれないが、再作成によって Sage-Too の設定が初期化されたので、
お使いの方は注意されたい。

B. 作業手順



1. ブックマークのバックアップ

まず、目的のプロファイルで Firefox を起動しておいて、ブックマークのバックアップを取る。
バックアップの形式には、おなじみ HTML 形式と JSON 形式の二通りがあって、
大きな違いは、ブックマークの favicon が含まれているかどうかだ。
favicon をリストアしたいのなら、favicon のデータ込みでバックアップされる HTML 形式を、
favicon も初期化したいという場合には、favicon データなしの JSON 形式を使う事になるだろう。

 a). HTML 形式の場合 (favicon あり)
「ブックマーク」→「ブックマークの管理」で管理ウィンドウを開いて、
「インポートとバックアップ」で「HTML としてエクスポート」を選択。
bookmarks.html が作成されるので、これをプロファイルフォルダに移動。
(すでに bookmarks.html が存在している場合は、上書き)
さらに、JSON 形式のバックアップファイルがあるとそっちを優先して使用するので、
\bookmarkbackups フォルダを、中身の bookmarks-xxxx.json ファイルごと別の場所に移動しておく。

 b). JSON 形式の場合 (favicon なし)
まず \bookmarkbackups フォルダの中身を見て、一番新しいバックアップの日付を確認する。
作業日のものがあって、当日にブックマークの編集をしてなければ、2. の再作成に進む。
古いものしかなければ、「ブックマーク」→「ブックマークの管理」で管理ウィンドウを開いて、
「インポートとバックアップ」で「バックアップ」を選択。
「ブックマーク 200x-xx-xx.json」 (200x-xx-xx は作業日の日付) の保存場所を聞かれるが、
これはデスクトップとかで構わない。
バックアップが作成されると同時に \bookmarkbackups フォルダにも
bookmarks-200x-xx-xx.json が作成される筈なので、ファイル名とタイムスタンプを確認。
もし作成されていなかったら、別の場所に作った奴を bookmarks-200x-xx-xx.json にリネームして、
\bookmarkbackups フォルダにコピー。

2. places.sqlite の再作成

Firefox を終了。(気になる人はタスクマネージャなどで確認)
プロファイルフォルダの places.sqlite を places.sqlite.bak などにリネーム。
もし places.sqlite-journal があれば、Firefox が終了していない可能性があるので再確認した上で、
これもリネーム (こっちは削除で良いような気もするが)。
Firefox を再起動すれば、places.sqlite が再作成されるだろう。
ブックマークツールバーなどで favicon のリストア状況を確認されたい。

3. browser.places.* のリセット

これで安心してはいけないw
about:config で browser.places.* の設定を、初期設定に戻す必要がある。
特に、browser.places.importBookmarksHTML が true になっていると、
ブックマークを編集しても次の再起動時に元に戻ってしまうだろう。
これ以外でも browser.places.* の設定で「ユーザ設定」になっているものは全てリセットした方が良いらしい。
ブックマークが保存できない を参照されたい。
(フィルタ欄の入力は、".pla" すなわちドットピーエルエーで OK)

ただし、小生の環境では、一度リセットしても再起動で次の 4つがユーザ設定になっていた。
再起動後の状態を以下に記しておく。

browser.places.importDefaults : false
browser.places.migratePostDataAnnotations : false
browser.places.smartBookmarksVersion : 1
browser.places.updateRecentTagsUri : false

あと、上記の SUMO ページに記載がある通り、
古い Places ファイルへの参照を取り除くために localstore.rdf を削除する必要があるかもしれない。
ナビゲーションツールバーのカスタマイズなどの設定が初期化されるので、
しばらく使ってみて挙動がおかしかったら、で良いと思われる。
つうか、両方いっぺんにやってしまうと、問題が places.sqlite なのか localstore.rdf なのか、
切り分けが難しくなるだろう。

4. 再肥大化の抑制

ようやく最後の手順で、これはオプション。
places.sqlite を小さくしたのは良いが、同じ使い方をしていれば早晩また肥大化するだろう。
再度の肥大化を防ぐにはどうしたらいいか。

人によって使い方は様々なので一概には言えないが、思いついたのは次の二つ。
 a). favicon を読み込まない
 b). 履歴の保存期間を短くする
いずれも about:config で設定できるので、about:config を開いたついでに設定しておきたい。

a). の場合は、browser.chrome.site_icons を false に設定する。
これによって favicon は読み込まれなくなるので、places.sqlite の moz_favicons は大きくならない(筈)。
なお、同じような設定で browser.chrome.favicons というのもあるが、
これは後方互換のために存在すると思われ、browser.chrome.site_icons の設定だけで良い(筈)。

(筈)が二つ続いたが、実は小生はこの設定を行なっていない。
ブックマークの favicon がない状態には耐えられないのだ。
Mozilla suite の時代には、なくてもどうという事はなかったのだが(^^;

b). の方は、browser.history_expire_daysbrowser.history_expire_days_min を設定する。
expire_days_min は、「ツール」→「オプション」→「プライバシー」の「履歴」で設定できるが、
「少なくともX日分」という (いささか苦しい) 日本語にあるように、履歴の最短保持日数の設定である。
最長保持日数を変更するには about:config で expire_days の方を設定しなければならない。
ちなみにデフォルトでは、
browser.history_expire_days_min : 90日
browser.history_expire_days : 180日
である。
従って、デフォルトの状態では、browser.history_expire_sites で設定された履歴数
(デフォルトでは 40,000。一日200サイト×180日で決まったようだ)
を超えない限り、過去半年分の履歴が保存される事になる。
再作成前の places.sqlite は、このデフォルト設定を使用していた。

上記したように、データが削除されてもファイルのサイズは小さくならないので、
当初に設定する日数は少なめの方が良いだろうと考え、
今回は browser.history_expire_days_min を 25日に
browser.history_expire_days を 30日に設定してみた。
この設定でいいかどうかは、あと1ヶ月しないとわからないわけで、
思い出したら追記したいと考えている。(が、忘れる可能性も高い)

最後に、browser.history_expire_days.mirror について少々。
about:config で browser.history_expire_days と一緒に出てくる (事がある) 設定項目で、
設定値は同じ日数になっている筈だ。
browser.history_expire_days を変更したらこちらも変えなければならないような気がするが、
変更する必要はない。
これは、履歴を保存する・しないを設定するチェックボックスを簡単にコーディングするための
言わばダミー設定だからだ。

http://mxr.mozilla.org/mozilla1.8/source/browser/components/preferences/privacy.js#61

* browser.history_expire_days.mirror
* - a preference whose value mirrors that of browser.history_expire_days, to
* make the "days of history" checkbox easier to code

オプション設定画面以外の所からは参照されていないので、デフォルトのままで構わないだろうし、
心配性の人は browser.history_expire_days と同じ数値にしておけば良ろしかろう。


<2009年5月14日追記>
やっぱり忘れてたので、今さらながら結果報告。
履歴の保存期間を30日にした状態で 3ヶ月経過した時点のファイルサイズは、
メインの方が 4.1M → 560K → 1.8M、サブの方が 30M → 580K → 1.1M だった。
4月の時点のサイズも記録してあるが、あまり変わっていないので、ここいら辺で安定だろうか。
<追記終り>

テーマ

関連テーマ 一覧


月別リンク

トラックバック(4件)

タイトル (本文) ブログ名/日時
[Win]Firefoxのsqliteデータを圧縮するバッチ
Firefoxの起動・終了を速くするために、sqliteデータを再作成・圧縮するというのが流行っている?ようなので、乗ってみる。サイズを小さくするためには一度削除して再作成させるといいのだが、そこはそれ、データが失われるなど難しい。 すっきりしたい場合は、大きくなりが ...続きを見る
それはそれ。これはこれ。
2009/03/12 22:28
【作業メモ】Firefoxが重いのに今頃気がついた
家で使用しているPCや、自社で支給されているノートPCはそこそこのスペックがあるためか、Firefoxが重いなんて感じたことは今の今まで感じたこと... ...続きを見る
日々、オタおっさん化
2009/11/19 11:02
Core i7と Windows7(64bit)ノートとFirefoxの憂鬱:スーパーフェッチによる...
新しいノートPC、Dell Studio 1557を導入してから3ヶ月が過ぎまし... ...続きを見る
[の] のまのしわざ
2010/07/09 23:25
Firefoxが頻繁に「応答なし」になることへの対応
現在Firefox3.6を使っていますが、ブラウズ中頻繁に「応答なし」になることがあります。20〜30秒何もしないで待てば正常に戻るのですが、これが日に何回も起こるとイライラします。更に終了直後にもう一度起動しようすると「Firefox は起動していますが応答しません」が出て起動もできません。 最初はアドオンが原因と思い普段使わないアドオンはアンインストールしました。しかしいっこうに改善される気配がありません。 そこで検索してみたところ 「places.sqliteの肥大化を抑制してFirefo... ...続きを見る
WebCraft
2011/01/01 03:22

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
places.sqlite の再作成 Firefox Hacks 翻訳日記/BIGLOBEウェブリブログ
文字サイズ:       閉じる