2011-05-13 10 views
1

大量のデータに対していくつかのアルゴリズムを実行し、各結果をデータベースに格納する必要があります。大量のレコードをデータベースに挿入する

アルゴリズムの実行回数は80,000-90,000で、各サイクルは約2秒かかります(アルゴリズムのみ)。 これは非常に時間がかかります。 (DBに格納する必要があります)今

私のデータベースのSQL Server 2008の 私はado.netエンティティフレームワークを使用したい(それはそれは良いではありません、この作業のために良いのですか?)
出力データはプレーンです生の(それほど大きくない)、日付と時間のような列を維持するものもあります。

そのためのベストプラクティスは何ですか?
各アルゴリズムが完了すると、行ごとに挿入しますか?結果をメモリに保存し、作業が終了したらデータを挿入しますか?

+1

DB挿入は、ここではボトルネックではありません。接続を開いて2秒ごとに結果を挿入するだけです。 – leppie

+0

@leppie、EFはどうですか?それを使っても大丈夫ですか? – jullin

+0

できます。それはシンプルであれば、私はおそらくさえ気にしないだろう:) – leppie

答えて

3

アルゴリズムを最初にすべてのレコードに対して実行した後、BulkInsertを試してみませんか? データベースへのデータの取得は非常に効率的です。

http://msdn.microsoft.com/en-us/library/ms188365.aspx

+0

はい、それはスレッド後藤次cycle'とスレッドに、おそらく何か実行サイクル-送る 'のような結果を一つのテーブル – Serghei

+0

に大量のデータをインポートするための最良の方法ですがBulkInsertを使用してデータをデータベースにロードします。 –

+0

最初に、すべてのアルゴリズムの結果をローカルに格納し、一度に挿入した後にのみ結果を格納する必要がありますか? – jullin

1

あなたがSqlBulkCopyクラスを使用すると、ソースデータとしてのDataTableを使用することができます。これは、複数のINSERTに比べて本当に速いです。

+0

これで、私はデータテーブルにデータを挿入しなければならないでしょう。 – jullin

+0

@jullin - DataTableが必要ない場合は、 'IDataReader'バージョンを作成できます。私は一度にすべてのデータを格納するSqlBulkCopyを使用する必要があります理解し、IDataReaderを –

+0

@Marc Gravellなどのデータをラップし、すべてのアルゴリズムの実行後に行で行ないのは簡単なことに、それが正しいのですか? – jullin

0

あなたがsqlbulkcopyを使用しなかった場合は、次回行うことができます:

  1. ストアデータのローカル変数
  2. にすべてのデータが収集された後、SQLトランザクションを開始し、DBへのそれぞれの行を挿入します。すべての挿入クエリーが実行された後、コミットします。