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