0

作業中のアプリに問題があります。このアプリを使用すると、ユーザーはCSVファイルをアップロードできます。このファイルはアプリによって処理され、レコードをいくつかのテーブルに作成します。パフォーマンスを向上させるために、テーブルの1つに対して、mysqlLOAD DATA INFILE機能を使用するための新しいCSVファイルが生成されます。

代わりに、処理にかかる時間が長くなっているようです。を使用して、すべての処理をバックグラウンドにプッシュしていますsidekiq。CSVは問題なく作成されているようですが、load dataクエリを実行すると、そこにあるだけで、何をしているのかわかりません。

私の処理関数は次のことを行います:

CSV.open(output_path, 'w+', { force_quotes: true }) do |writer|
    writer << headers

    while rows.count > 0
      ....
      data_sets.each do |ds|
        writer << [UUIDTools::UUID.random_create, resp, row[set], ds.id, now, now]
        set += 1
      end
      resp += 1
    end
end

sql = "LOAD DATA LOCAL INFILE '#{output_path}'
       INTO TABLE data_set_responses
       FIELDS TERMINATED BY ',' ENCLOSED BY '\"'
       LINES TERMINATED BY '\n'
       (id, response_number, response, data_set_id, created_at, updated_at)"

con = ActiveRecord::Base.connection
con.execute("SET autocommit = 0;")
con.execute("SET unique_checks = 0;")
con.execute("SET foreign_key_checks = 0;")
con.execute("LOCK TABLES data_set_responses WRITE;")
con.execute(sql)
con.execute("UNLOCK TABLES;")
con.execute("COMMIT;")
con.execute("SET autocommit = 1;")
con.execute("SET unique_checks = 1;")
con.execute("SET foreign_key_checks = 1;")

現在、私のsidekiqプロセスは22分間実行されていますが、まだ終了していません。約70万行を挿入する必要がありますが、これほど長くかかることはありません。

挿入しているテーブルには、主キー(uuid)のバイナリフィールドがあるので、速度が低下しているかどうかわかりませんか?

何か案は?

4

1 に答える 1

1

最終的に、データ構造を、この構造が行っていた膨大な数の行を必要としないものに変更しました。私はそれをほんの数秒にまとめました:)

于 2013-02-08T00:33:17.197 に答える