Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
4
Help us understand the problem. What is going on with this article?
@Salinger

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

More than 5 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
  ...

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

おわりに

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

4
Help us understand the problem. What is going on with this article?
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
Salinger
the-room4d
データを分析してます。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
4
Help us understand the problem. What is going on with this article?