2016-06-16 5 views
0

私が今問題としている問題は、Webappが特定のユーザーの下にあるすべてのアカウントのスプレッドシートを生成し、このスプレッドシートをレポートとして電子メールで送信する必要があることです。すべてがMongoデータベースに保存され、Mongoidクエリを使用してアクセスされます。コードは現時点で次のように設定されています:膨大な列挙数を効率的に処理するために複数のsidekiqワーカーを使用するにはどうすればよいですか?

def some function 
    @user = #mongoid query 
    # use Axlsx to create a worksheet in a workbook 
    @user.get_accounts.each do |u| 
    #code to add account information to row 
    sheet.add_row(row) 
    end 
    #return sheet 
end 

この単純なループは、ほとんどのユーザーに最適です。しかし、私は100k +のアカウントを持つ少数のユーザーしかいないと思いますが、これはシステムのメモリを過負荷にし、スプレッドシートは決して作成されず、送信されません。

私は、あなたがこのアカウントを使ってこれらのユーザーを処理するよう提案しているかどうかを知りたいと思っていました。私が考えていた一般的なアーキテクチャーは、より管理しやすいサイズのループのSidekiqワーカー(例えば、一度に1000人ずつ処理する100人のワーカー、または100人を処理する1000人のワーカー)を使用してそれをチャンクすることでした。これはSidekiqの適切な使い方ですか、もしそうなら、これを理解するために私が読むことができるドキュメントがありますか?そうでない場合は、さらに効率的な方法がありますか?

答えて

0

アカウントのページを変更する必要があります。今のところ、コードはすべての100k +のアカウントをメモリにロードするように見えます。 ActiveRecordは自動ページ設定の方法をfind_eachでサポートしています。

+0

私はクエリ内のアカウントを介してペーニングすることは、私の想定された方法よりも簡単であることがわかります。しかし、私はActiveRecordではなくMongoidを使用しています。 [このスレッドは(http://stackoverflow.com/questions/7041224/finding-mongodb-records-in-batches-using-mongoid-ruby-adapter)は私が探しているものでしょうか? – manestay

+0

右、私はモンゴイドとページを貼る方法はわかりませんが、それは関連性のある、幸運に見えます! –

関連する問題