質問: 私は大量のレコードを自分のアプリケーションにロードして(100万+)、それらに対して処理を行います。処理には、すべてがメモリに格納されている必要があります。 その後、私はすべての(今変更された)レコードを空のテーブルにダンプします。 レコードの読み込みにはほんの数秒しか`MyRecord` 、 `MyRecord`項目の大きな配列に`MyRecord`ます。 `SqlBulkCopy`を使用した保存には数秒`SqlBulkCopy`かかりません。 しかし、 `SqlBulkCopy`は`DataTable`を必要とします(私は信じてい`DataTable` )。そして、 `DataTable`への私のレコードのロードは遅いです - 毎分約7500レコード ``` dataTable.Rows.Add(myRecord.Name, myRecord.Age, ....) ``` この中間ステップをより速く実行する方法はありますか?
回答: 遅延は、すべてをDataTableにバッファリングしてからサーバーに送信する必要があるために発生します。パフォーマンスを向上させるには、レコードをSqlBulkCopy immediatellyに送信し、クラスに独自のバッファリングとバッチ処理を使用させる必要があります。 SqlBulkCopyはIDataReaderで動作します。すべてのADO.NETデータリーダーがこのインターフェイスを実装しているので、データリーダーから読み取ったデータをSqlBulkCopyにプッシュできます。 他のケースでは、オブジェクトのIEnumerableがあると仮定すると、 FastMemberパッケージのMarc GravelのObjectReaderを使用して、IEnumerableの上にIDataReaderを作成できます。このデータリーダーはすべてを一度に読み込むわけでは*ない*ので、SqlBulkCopyが要求するまでデータはキャッシュされません。 Marc Gravelの例をコピーする: ``` IEnumerable data = ... using(var bcp = new SqlBulkCopy(connection)) using(var reader = ObjectReader.Create(data, "Id", "Name", "Description")) { bcp.DestinationTableName = "SomeTable"; bcp.WriteToServer(reader); } ```