couchDB(Cloudant)でError running query. OS process timed out

割と致命的





原因


1つのデータあたりのViewの作成時間が長すぎると
Error running query. Reason:(os_process_error) OS process timed out
というエラーメッセージを出してタイムアウトしてしまう。
例えば以下のようなデータ
{
  "list":[
    { text: "aaaaaa" },
    { text: "bbbbbb" },
    { text: "cccccc" },
    { text: "aaaaaa" },
    // ....以下textが大量にある
  ]
}
に対して
function (doc) {
  for( var i=0; i<doc.list.length; i++ ) {
    // 単語単位でemit
    var chars = doc.list[i].text.split("")
    for( var j=0; j<chars.length; j++ ) {
      emit(chars[j], doc._id);
    }
  }
}
のような一つのデータに対してループを回して何かするといったDesignを登録すると
Error running query. Reason:(os_process_error) OS process timed out
が返ってくるようになる。
ちなみに上記例は完全な部分一致文字列検索を想定したもの。

一度発生すると対応するまでDBが利用できない。


解決方法・対策



CouchDBではタイムアウトまでの時間を設定できるらしい
http://docs.couchdb.org/en/stable/config/couchdb.html#couchdb/os_process_timeout
ただしViewの作成時間が増えるうえ、上記の対応ができないケースもある(Cloudantとか)


解消するには対象ドキュメントを特定して削除するか (Viewが使えないので全部見る必要あり)
計算に時間がかかっているViewを削除する必要がある(こちらのほうが現実的か)

こうなった場合よほどのことがない限り設計を変える必要がある。
一回のクエリで対応せずに複数回に分けたり、CouchDBから取ってきた後データを加工するといった対応が必要。


一つ言えることは多数の検索条件からデータを絞り込むような業務用アプリケーションにCouchDBは向いていないということか。


2017年12月18日月曜日