1

の使い方を学んでいますCelluloid。私はすべてのドキュメントを読み、それを使用する方法についてのアイデアはあると思いますが、練習が不足しています。ほぼ 12,000 行の CSV ファイルでテストしようとしています。 

1 つのジョブにアクターを何人割り当てればよいかわかりません。この数は動的でなければならないと思います。この Railscasts エピソードによると、デフォルトの数はマシンのコア数に設定されていますが、ワークロードに基づいてこの数を変更する必要がありますか?

12,000 件のレコードを処理する必要があります。以下のコードを実行すると、プール内のすべてのアクターが開始され、ジョブを処理するためにキューに入れられると思います。しかし、作品に動的に割り当てるアクターの数をどのように測定すればよいでしょうか?

私の理解にはまだ多くの穴がありますので、私の実装全体に気軽に挑戦してください。

class Model < ActiveRecord::Base
  include Celluloid
  def initialize(row)
    self.name = row[0]
    self.alt_id = row[1]
    self.definition = row[2]
    self.save
    self.terminate
  end    
end

CSV.open("./files/my_file.csv", "wb") do |csv|
  Model.supervise(csv)
end
4

1 に答える 1

2

まず、あなたの場合、アクター用に別のクラスを作成する必要があります。

class Model < ActiveRecord::Base
  def self.save_from_csv(row)
    new.tap do |m|
      m.name = row[0]
      m.alt_id = row[1]
      m.definition = row[2]
      m.save
    end
  end    
end

class CSVWorker
  include Celluloid

  def persist_from_csv(row)
    Model.persist_from_csv(row)
  end
end

その後、プールを作成し、各行に対して作業を行うことができます。

pool = CSVWorker.pool(size: 4)
CSV.foreach("./files/my_file.csv") do |row|
  pool.async.persist_from_csv(row)
end

に注意してasyncください。それが擬似並列で実行される理由です。

私はこれをテストしていないことを認めますが、動作する場合でも、麻痺から実際に利益があるかどうかを確認するためにベンチマークする必要があります. 関与するIOはDBクエリのみであるため、MRIではるかに高速になるとは思えません。

于 2015-05-06T22:12:38.983 に答える