3月5日

2012/3/5作成

昨日仕込んだDBのインポートはまだ終わってなかった。えー、そんなに時間がかかるの?というか、どうもメモリが不足していてスワップしてる模様。これはメモリを増やしてやり直したほうがいいかな。あと、MySQLの設定がデフォルトのままだから多少はチューニングしたほうがいいだろうなぁ。

と思っていたら、ディスクがあふれてしまった。がーん。仮想マシンには20GBを割り当てていたんだけど、jawpのデータをいろいろ扱うには流石に少なすぎたか。これは仮想マシンから作り直さないとだめだな。ということでディスクを100GB割り当てて仮想マシンを作り直し。しかし、インストールも全部やり直しだから面倒だなぁ。あと、この調子だとホストマシンのHDDも不足してくるかもしれないな。なんせいまどき500GBしかないもんだから。CPUのコアも欲しいし、色々考えるとマシン自体の買い替えを検討した方がいいのかな。もう3年使っているPCだから、いろんな意味で性能的に不足してくるところはあるよねぇ。

新しい仮想マシンを作成して、FreeBSDのインストールから始める。メモリは768MB割り当てたぞ。これでどうだ。MySQLとかapacheとかphpとか色々必要なものをインストールして環境構築がだいたい完了。MySQLの設定もデフォルトではまずいだろう。ぐぐってみると、サンプルの設定ファイルが色々用意されているらしい。いかにもメモリを使用しそうなmy-huge.cnfというのを/etc/my.cnfにコピー。

この状態でDBのインポートを始めたんだけど、速くはなったけど、やっぱり遅い。日本語が変やな。まあ、期待したほど速くはなってないということだ。色々調べてみたところ、MySQL5.5からはInnoDBがデフォルトになったらしい。えー、そうなん。MySQLにはDBのタイプとしてInnoDBとMyISAMというのがあるんだけど、InnoDBの方が高機能なんだけど遅い。この際高機能はいらんのでMyISAMを使いたいということで、ぐぐって設定を調べる。/etc/my.cnfに

skip-innodb
default-storage-engine=MyISAM

という2行を追加すればいいらしい。もちろんMySQLは再起動するわけだけど。この状態でインポートをすると、更に速くなっていい感じだったんだけど、途中でmax_binlog_stmt_cache_sizeが足りないとかエラーが出る。なんじゃこのパラメータは。ぐぐってみても、新しく追加されたパラメータなのか、全然情報が無い。適当に設定してみてもうまくいかないので、MyISAMはやめてInnoDBでやり直す。ていうか、MySQLを5.5ではなく古いバージョンにすればうまくいくのかな。

ということでMySQL5.5をアンインストールしてMySQL5.1をインストール。DBタイプはMyISAMにするようにだけ設定変更してインポートしたら、数分で全部インポートできた。あら?なんか拍子抜け。まあ、色々試したお陰でノウハウが少しは出来たので、別に構わないんだけど。

ようやくDBがインポートできたので、短いページの抽出SQLを実行。そうなのよね、やりたいことはただそれだけなのに、準備に凄い手間が掛かってしまった。

しばらくして抽出完了。が、結果がでかい。1万件以上ある。これはおかしい。リダイレクトが混じっているのかと思ったけど、それにしては桁が少ない。抽出された記事を実際に調べてみると、どうやら「#転送」という記法で書かれたリダイレクト記事が含まれているっぽい。つまり、xml2sqlが古くてこういう新しいwiki記法に対応してないということやな。仕方がないのでxml2sqlのソースを少し書き換えて対応させてみる。ということで、またインポートのし直し。はあ。

頑張ってMySQLでやろうと努力しているけど、これってどう考えてもjawptoolに機能を搭載したほうが早いよな。と思って、さくっとプログラムを書いてみたら、さくっと出来上がった。なんか、色々苦労したのがなんだったんだという感じ。というか、ウィキペディアのダンプのような大規模なデータを処理するのって通常はRDBMSを使用するんだけど、今回のようにインポートに手間が非常に掛かるという問題がある。データベースダンプをperlでシンプルにテキスト処理するというjawptoolのコンセプトは意外といい線をついているのかもしれないと、今さらながらに自画自賛してみたり。


あおやぎのさいと2.0 新人うぃきめでぃあん日記