Authentication




Cancel OK
B!コメントする  2013-03-07 14:54:00 by old

preg-matchにおけるCompilation failed: regular expression is too large at offset というエラー

形態素解析もどきをぼちぼち作っているなかで
とりあえず単語を登録してとりあえず文章をぶつ切りにしてみようと思った。

そこでとりあえずpregmatchに片っ端から辞書の語彙を突っ込んでみたところ、あるところを境にエラーが出るようになった。

Warning: preg
match() [function.preg-match]: Compilation failed: regular expression is too large at offset 57852 in /var/www/html/test.php on line 657

調べてみるとどうやらPCREによる制限にひっかかったという内容らしい。
PCREについては

http://zeijaku.net/blog#blog201302221522

でも記載してあるのでそっちを参照してもらうとして
これはどうやらPCREライブラリを使う際の制限のようで、再現なく放り込むことで過剰な負荷をかけたりフローをさせたりする危険を避けるためのものだそうです。

ちなみにPCREに関する設定については以下に詳しいものがありました。

http://php.net/manual/ja/pcre.configuration.php

要はデフォルトの制限にひっかかったために今回のエラーが出ているとわかりました。

しかしこれによるとPHP5.2以降では設定を変更することが出来るようなので、変更して対応をしようと思いましたが、環境によって異なるので一致条件の部分を分割して対応しました。
こんな感じ

pregmatch("すごいたくさんの単語やフレーズ", $word, $match)

   ↓

if( preg
match("すごいたくさんの単語", $word, $match) )
{

}
elseif( preg_match("すごいたくさんのフレーズ", $word, $match)
{

}


という感じにしました。
スマートなやり方ではないですが、無理にメモリ確保してほかに影響出るとこまりますしね。
本当はデータベースに突っ込んで一致検索とかかけようと思ったんですが、SQLで正規表現一致とかすると意外と遅いということがわかりました。
泥臭いですがまだこっちの方が早いという事でこの方法にとりあえずしてみましたが、もう少しスマートな方法がないか模索してみます。


PHP  

  • コメント
  • コメントはまだありません