White scenery @showyou, hatena

If you have any comments, you may also send twitter @shsub or @showyou.

集合知プログラミング

2.4打ち込んだ。
コードも短いのであっさり動いた。だがいろいろ気になることが。まず類似性*実際の和を類似性の和で割ってで、本当によさげな評価って出るんですかね?なんか数学的に式が出てくるのかな。あとtotals.setdefault(item,0)ってのは初回のみtotals[item]に0入れるのかしら〜。ちょっとあとで調べよう。

追記

http://d.hatena.ne.jp/s-n-k/20080727/1217161109より。
もしtotals[item]に何も入ってなかったら、0を入れるって感じですねー。いちいちhas_keyしなくていいから便利そう。

gitでbranch切ったときにわからないこと

まあまた良くわからない図で申し訳ないですが。


現在はま達を作ってるとき、まずyuka_をmasterにして、あるcommitからbranch切って独自カスタマイズしたものをそれぞれhama(2),donsuke(3)とか名づけてます。

その後、yuka_にいろいろ修正を加えてcommitしました(1->4)。

その修正内容をhamaやdonsukeにも反映させたい。もちろん独自カスタマイズはそのままで(2+4とか3+4はそういう意味)

んでhamaとかdonsukeも単独で動くか確認してみたいので、yuka_とは別フォルダにしてます。

こういうとき、gitはどう管理すると楽なんだろ・・そもそもbranchじゃなくてforkにして、hama,donsukeではyuka_をfetchしたほうがいいのだろうか?

MySQLでインデックス設定したらすげー早くなった

知らなくてごめんなさい。こんなこと業務でやってる人とかは当然なんだろうけど。

今までid以外にインデックスを指定してなかったのだけど、別のカラムにインデックスを指定したら5倍くらい速くなった。

処理内容

twitterの発言をMeCabで分割した後、マルコフ連鎖の「現在の単語:次の単語」の組み合わせで保存する(以降この組み合わせの表をマルコフテーブルと呼ぶ)。
保存前に既にその組み合わせがあるかどうかチェック。既にあればその項目のcountに+1する。

スペック

  • Core2Duo E6600, メモリ2GB, Ubuntu 8.10 32bit, MySQL 5.0
  • ストレージエンジンはMyISAM使用。それ以外はUbuntuデフォルトほぼそのまま
  • 発言 全38700件中 処理対象約12000件
  • 条件A:インデックスは特に作らず,条件B:「現在の単語」でインデックス作成

テスト1 既存マルコフテーブル 0件

条件 時間[min] 件数[件] 時間当たり処理件数[件/min]
A 5min 250 50

テスト2 既存マルコフテーブル 20万件

条件 時間[min] 件数[件] 時間当たり処理件数[件/min]
B 5 150 30
A 5 30 6

テスト3 検索速度

検索単語 条件A検索時間[sec] 条件B検索時間[sec] 結果件数
start(開始文字) 0.35 0.16 約9000件
むきゅー 0.27 0.00 1件

尚検索の際にはRESET QUERY CACHE;でクエリーキャッシュは消しています。

結論

テスト1と2をみればわかる通り、検索するデータが増えると、インデックスない場合大幅に速度が低下しますね。
あとインデックスを作るとselectの速度も当然あがります。まあ上記の結果は厳密に測定してるわけではないのでばらつきはあるんでしょうが。あとインデックスを作った場合insertはその分遅くなるんでしょうけど、どのくらい遅くなるんでしょう。