2019年3月10日日曜日

FreeBSD に Perl の MaxMind::DB::Readers::XS モジュールをいれてみた

 前回 Perl モジュールの GeoIP2 を使う (on FreeBSD) として,GeoIP2 の使い方のメモを書いておいた。 ところが,Perl の GeoIP2 モジュールを使うと,IP アドレスから住所情報を得るのが非常に遅い。 複数件検索をかけると,日が暮れるんじゃないか?と思うぐらい遅い。 そのことについて書こう。

 きっかけは,前回も書いたが,FreeBSD の ports ツリーから,「Geo::IP」用のエントリーが削除されたことに始まる。 Geo-IP は MaxMind 社のデータベースを使うためのモジュールで,これまで無料で使える精度のあまり高くない「GeoLite」データベースを使うのに利用していた。 しかし,MaxMind 社がデータベースの構造を変えたみたいで,今後は「GeoIP2」を使え,というメッセージが出てきたので「GeoIP2」を使ってみた。それ自体はいいのだが,なにせデータの読み出しが遅い。ほんとに複数件の IP アドレスの住所情報を調べると,無限に時間がかかる感じがした。

 これをネットで調べると,どうも「MaxMind::DB::Readers::XS」を使うといいと出てくる。 前回も書いたが,GeoIP2 をインストールすると,下記のようなものが一緒にインストールされる。
・GeoIP2
・GeoIP2::Database::Reader
・GeoIP2::Model::City
・/usr/local/lib/libmaxminddb.so
などがインストールされ,さらに
MaxMind::DB::Reader
がインストールされる。

 この,最後の,「MaxMind::DB::Reader」が実際にデータベースから情報を取出している。 この「MaxMind::DB::Reader」を見ると,さらに「MaxMind::DB::Reader::PP」を読み出している。 ここの「PP」は,PurePerl を意味し,Perl のルーチンのみで書かれている。 そのため読み出しが非常に遅くなっているみたい。 しかし,「MaxMind::DB::Reader」では「MaxMind::DB::Reader::PP」の代わりに「MaxMind::DB::Reader::XS」というのがあれば,そちらを優先的に読み込む,と書いてある。

 そこで,FreeBSD の ports を探してみると,ちゃんとあった。
/usr/ports/net/p5-MaxMind-DB-Reader-XS/
当初,meta::cpan からインストールしないといけない,と思って探したのだが,なかなか見つからなくて,困ってしまった。 GeoIP2 というのが入ってないので,わからなかったみたい。 MaxMind というキーワードで探すとすぐに見つかった。

 で,インストールすると,「MaxMind-DB-Reader-XS」は下記のディレクトリにインストールされていた。
/usr/local/lib/perl5/site_perl/mach/5.28/auto/MaxMind/DB/Reader/XS/XS.so
/usr/local/lib/perl5/site_perl/mach/5.28/MaxMind/DB/Reader/XS.pm
/usr/local/lib/perl5/site_perl/man/man3/MaxMind::DB::Reader::XS.3
ここで,XS.so は外部ライブラリで,これを使うから速いみたい。

 ちなみに「MaxMind-DB-Reader-PP」は下記にインストールされている。
/usr/local/lib/perl5/site_perl/MaxMind/DB/Reader/PP.pm
他にも「/usr/local/lib/perl5/site_perl/MaxMind/DB/」の下にいくつかインストールされていた。

0 件のコメント: