1

Twitter、Facebook などのソーシャル メディア サイトから多くのデータを取得する Ruby on Rails アプリケーションがあります。

レコードをページとして表示するインデックス ページがあります。ページングにはカミナリを使用しています。

私の問題はビッグデータだと思います。何百万ものレコードがあり、それらをカミナリのインデックス ページに表示したいとします。ブラウザでシステムを実行しようとすると、Heroku から H12 エラー (リクエストのタイムアウト) が返されます。

アプリのパフォーマンスを改善するにはどうすればよいですか? インデックス ページに表示されるレコードのみを取得するという考えがあります。同様に、Kaminari の 2 ページ目のリンクをクリックすると、データベースから 2 ページ目のレコードのみが取得されます。アイデアは基本的にそれですが、どこから始めてどのように実装すればよいかわかりません。

ここに私のコントローラーからのコードの例があります:

@ca_responses = @ca_responses_for_adaptors.where(:ca_request_id => @conditions)
                                                 .order(sort_column + " " + sort_direction)
                                                 .page(params[:page]).per(5)

@ca_responses: 私の記録

@ca_responses_for_adaptor: アダプターに基づくレコード。管理者と考えると、すべてのレコードが返されます。

@condition: 指定されたアダプタ レコードを取得します。たとえば、Twitter 関連のレコードのみを取得するなど。

4

2 に答える 2

0

検索結果のデータが入力されるページ キャッシュ テーブルを作成することから始めることができます。それが一つのアプローチかもしれません。マイナス面はほとんどないかもしれませんが、正確な問題を知っていれば、より良い解決策を提案できます. 1 つのページに何百万ものユーザーをリストし、ページのページネーション (?) によってユーザーにアクセスするとは思えません。または、私は間違っています。

編集:

ページネーションにはほとんど問題がない可能性があります。まず、ページネーション gem は次のように機能します。すべてのデータを取得し、ページ番号をクリックすると、リスト全体から 2 番目の 5 つの要素 (または設定したもの) のみを取得します。ここでの問題はfetching all the data before paginating. 100 万件のレコードがある場合、ページごとに時間がかかることがあります。SQL クエリを実行してデータベースから 1 つの量のデータを選択する新しいメソッドを定義できoffset、そのページのデータのみをフェッチするように命令を設定できます。この場合、paginate gem は役に立たないので、削除する必要があります。

2 番目のオプションは、user_cash のようなものを使用することです。これは、画面に表示されるレコードをいくつかだけ持つ新しいテーブルを作成することを意味します。テーブルは通常のユーザーテーブルよりも小さくなり、それを介して検索する方が高速になります。

他のより高度なソリューションがあるかもしれませんが、アプリケーションでそれを使用できる (したい) とは思えません。

于 2013-09-16T08:25:45.803 に答える
0

Kaminari は、期待どおりに既にレコードのページ付けを行っています。

Heroku は、ランダム ルーターが原因で、ランダム タイムアウト エラーが発生する傾向があります。

ローカルで再現してみてください。コードにボトルネックがあり、実際にリクエストが長すぎて返せない場合があります。データベースから 5 つの項目を要求するのに問題はないはずなので、その前後に実行に時間がかかるコードがある可能性があります。

本番データを使用してローカルですべてが問題ない場合は、new_relic を追加してリクエストを分析し、本番環境で特に問題が発生しているかどうか (およびその理由) を確認できます。

heroku ルーターが実際に問題であると思われる場合でも、ユニコーンを Web サーバーとして使用することはできますが、アプリがメモリを消費しすぎないように特に注意する必要があります (各ユニコーン ワーカーはアプリ全体の RAM を消費します。また、heroku のメモリ制限に達する可能性があり、H12 の代わりに R14 エラーが発生します)。

于 2013-09-16T08:29:19.053 に答える