家具工場の生産フローを監視する Web アプリケーションを作成しています。処理するデータは数千あります。これまでのところ、Mongrel + MySQL で RoR を実行していますが、非常に遅いです (一部のビューでは 2 ~ 4 分)。RoR ログを見ると、データベース クエリは遅くないようです (0 ~ 10 ミリ秒)。
データベース データをオブジェクトに変換するとき、RoR は遅くなりますか? 雑種は遅いですか?
編集:最初に:私は開発者でした。環境 実稼働環境では、最も遅いビューで 2 分かかります (これは、良好なコンピューターでは 1 分未満に短縮されます。私のコンピューターは 5 年使用されています)。ruby-prof と少しの常識で、どのメソッドがアプリケーションの速度を低下させているかを突き止めました。問題は、単一の SQL クエリが大規模なデータセットのループで呼び出されることです。
ofs = Ofkb.find_by_sql ["..some large SQL query..."]
for of in ofs # About 700-1000 elements
ops = Operation.find(..the single query..)
etc.
end
これらのメソッドでの ruby-prof の結果は次のとおりです。
%self total self wait child calls name
32.19 97.91 97.91 0.00 0.00 55 IO#gets (ruby_runtime:0}
28.31 86.39 86.08 0.00 0.32 32128 Mysql#query (ruby_runtime:0}
6.14 18.66 18.66 0.00 0.00 12432 IO#write (ruby_runtime:0}
0.80 2.53 2.42 0.00 0.11 32122 Mysql::Result#each_hash (ruby_runtime:0}
問題は、これらの単一のクエリを実際に回避できないことです。複雑なデータを計算する必要がある何千ものイベントがあります。現在、ページを最初にリクエストしない限り、これらのメソッドで memcached を使用しています。