Help us understand the problem. What is going on with this article?

Ruby + MeCab で Segmentation fault が発生した場合の対処

More than 3 years have passed since last update.

はじめに

MeCab の標準の Ruby 用バインディングを利用してテキスト解析を行っていたら、
hoge.rb:XX: [BUG] Segmentation fault at 0x00123456789abc
のようなエラーが発生した。

発生したタイミングは次の通り。
・処理が一定の負荷を超えた場合、毎回そこで落ちる。
・軽い処理の場合は落ちない。

落ちてた部分は下記の行。
node = MeCab::Tagger.new.parseToNode(string)

Python で同様の事例

以前 Python で意図しないガベージコレクションが実行されることにより、
似たような事例が発生した事があった。

(この件は次のサイトが詳しくまとめてくれている Shogo's Blog: MeCabをPythonから使う注意点とか)

対処

Ruby でも同じことが起きてるんじゃないかと思ったので、コードを書き換えた。
いきなり node を作らず、MeCab::Tagger.new を一度適当な変数に代入する。

before
require 'mecab'

node = MeCab::Tagger.new.parseToNode(string)
while node
  ...
after
require 'mecab'

m = MeCab::Tagger.new
node = m.parseToNode(string)
while node
  ...

これで無事に問題が発生しなくなった。

おわりに

無事問題は解決した。
おそらく他の言語でも似たような事例が発生する可能性あり。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away