我需要處理一個csv
文件,其中有10,000條記錄。每100條記錄大約需要4秒鐘,而且我很酷。
我希望能夠將10,000條記錄拆分爲100個作業,這將在服務器不繁忙時執行(不需要訂單)。Heroku rails排隊mongoid
我正在與heroku合作,如果可以的話,我會很樂意將處理分發給幾個節點。
這裏最好的做法是什麼?如何處理mongo連接?如何拆分作業,並創建將來運行的任務?
不需要一個完整的解決方案只是一些指導請。
我需要處理一個csv
文件,其中有10,000條記錄。每100條記錄大約需要4秒鐘,而且我很酷。
我希望能夠將10,000條記錄拆分爲100個作業,這將在服務器不繁忙時執行(不需要訂單)。Heroku rails排隊mongoid
我正在與heroku合作,如果可以的話,我會很樂意將處理分發給幾個節點。
這裏最好的做法是什麼?如何處理mongo連接?如何拆分作業,並創建將來運行的任務?
不需要一個完整的解決方案只是一些指導請。
我會和塞爾吉奧有同樣的建議。嘗試Sidekiq後臺工人的寶石。有一個kiqstand中間件可以和Mongoid一起使用。
粗糙可能素描:
# 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應該處理Mongoid MongoDB的連接。爲了分割任務,您可以創建第二個工作人員,提供第一個工作人員。由於發送到ImportWorker.perform_async(my_var)
的參數將被序列化並存儲在Redis中,因此它們應該很小,只是行參考等等。
希望能給出幾點提示。
也有看smarter_csv寶石 - 其目的是分批來讀取CSV文件,所以你可以把他們關到resque或sidekiq工人..
我可能會使用像[Sidekiq](http://mperham.github.com/sidekiq/)。不過,它需要redis。 – 2013-02-11 12:53:44