6

https://www.ruby-toolbox.com/categories/JSON_Parsersによると、Oj を使用してハッシュをシリアル化する際に、非常に高速化されるはずです。最新の gem をインストールし、Gemfile に含め、bundle install を実行し、それが使用されていることを確認できました。Rails 3 アプリでどの JSON レンダラーがアクティブになっているかを知るにはどうすればよいですか? ただし、JSON 応答のレンダリングはまったく高速化されていません。

ライブラリで、Ruby の mysql モジュールを使用してレガシー MySQL データベースにクエリを実行します。文字列を値に変換し、ハッシュの配列を返します。これは問題なく動作し、約 1.5 ~ 2 秒かかります。ここでデータのチャンクが取得されているはずです。

コントローラ

@data = Gina.points(params[:project], params[:test],
    session[:username], session[:password])
respond_to do |format|
    format.html { render :text => @data }
    format.json { render :json => @data } # :text => MultiJson.engine
end

図書館

dbh = Mysql.real_connect(@@host, u, p)
res = dbh.query("SELECT * FROM #{d}.#{t}")
    @data = []
    res.each_hash do |row|
    obj = {}
        row.each_pair do |k, v|
            v.match(/\A[+-]?\d+?(\.\d+)?\Z/) == nil ? obj[k] = v : obj[k] = v.to_f
        end
    @data << obj
end

私の問題は、「render :json」部分にあります。約 1.5 MB のデータの場合、これには約 8 ~ 9 秒かかります。より大きなデータセット (3.5 - 4 MB) では、25 または 30 かかることがあります。私は、ビューで jQuery からのプレーンな .get を使用して、ライブラリ内の「人工的な」セパレーターと一緒に文字列を詰め込むことによって、JSON を使用して書きました。 、そしてブラウザのJSで文字列をハッシュに解析します。小さいセットでは 1.4 秒、大きいセットでは 5 秒まで縮みます。

JSON のアプローチは簡潔で理解しやすく、物事が機能するように設計された方法と一致しています。文字列解析のアプローチは汚いハックで、私は好きではありませんが、6 倍高速です。2 つのアプローチを比較して学んだ興味深いことは、ハッキーな文字列を JSON に "シリアル化" することは、テキストを "レンダリング" するのと同じくらい速いということです (実際には何もする必要がないため)。このプロセスの集中的な部分は、実際には hashをシリアル化することですが、これはまさに、「より高速な」JSON ライブラリがより適切に機能することを期待する類のものです。

私は、Oj が私のために何をすべきかを根本的に誤解していますか、それとも何か間違ったことをしているだけですか?

4

2 に答える 2

3

Ojを使用していません!明示的に呼び出すまで、自動的に有効になりません。元のJSONレンダリングを次のように置き換えます

Oj.dump(args)
于 2012-10-27T07:18:07.110 に答える
2

このブログ投稿が指摘しているように、Rails は json エンコーディング メソッドto_jsonに独自のエンコーディング実装を使用するように強制しました。これは、Array、Hash、Integer などの基本クラスに影響します。

これは、デフォルトでは、json エンコーディング中に multi_json と oj がまったく使用されないことを意味します。これが、遅いと感じる理由です。

@yujingz が指摘したように、手動で Oj を使用してエンコードできます。

別の方法として、ブログ投稿を使用して、代わりに MultiJson を使用するパッチ gemを作成します。これにより、自動的に Oj を使用してエンコードされます。

于 2013-12-03T03:05:46.543 に答える