原因
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は向いていないということか。