2

csv10,000レコードを含むファイルを処理する必要があります。100レコードあたり約4秒かかります。私はそれでかっこいいです。
10,000レコードを100ジョブに分割できるようにしたいのですが、これはサーバーがビジーでないとき(注文は不要)に実行されます。

私はherokuを使用していますが、可能であれば、処理をいくつかのノードに分散させていただきます。

ここでのベストプラクティスは何ですか?mongo接続を処理する方法は?ジョブを分割し、将来実行されるこのタスクを作成するにはどうすればよいですか?

完全な解決策は必要ありません。ガイダンスをお願いします。

4

2 に答える 2

4

セルヒオと同じ提案があります。Sidekiqバックグラウンドワーカーの宝石を試してみてください。Mongoidで動作するkiqstandミドルウェアがあります。

大まかなスケッチ:

# Gemfile
gem 'kiqstand'
gem 'sidekiq'


# Procfile
web: ...
worker: bundle exec sidekiq -e $RACK_ENV -C config/sidekiq.yml


# config/sidekiq.yml
#
# Configuration file for Sidekiq.
# Options here can still be overridden by cmd line args.
---
:verbose: false
:namespace: sidekiq
:concurrency: 25
:queues:
  - [often, 7]
  - [default, 5]
  - [seldom, 3]


# config/initializers/sidekiq.rb
Sidekiq.configure_server do |config|
  # Require kiqstand middleware
  config.server_middleware do |chain|
    chain.add Kiqstand::Middleware
  end
end

# app/workers/import_worker.rb
# The actual Sidekiq worker that performs the input
class ImportWorker
  include Sidekiq::Worker

  def perform(my_var)
    # processing the csv
  end
end  

SidekiqとKiqstandは、MongoidMongodb接続を処理する必要があります。タスクを分割するために、最初のワーカーにフィードする2番目のワーカーを作成できます。に送信される引数はImportWorker.perform_async(my_var)シリアル化されてRedisに格納されるため、引数は小さくする必要があります。この場合は、行参照などです。

それがいくつかの指針を与えることを願っています。

于 2013-02-11T20:42:46.223 に答える
0

smarter_csv gem もご覧ください。これは、CSV ファイルをバッチで読み取るように設計されているため、resque または sidekiq ワーカーに渡すことができます。

https://github.com/tilo/smarter_csv

于 2013-04-20T19:38:52.803 に答える