3

CSV ファイルから ASP.NET MVC3/C#/Entity Framework アプリケーションへのインポートに取り組んでいます。

現在、これは私のコードですが、最適化を検討しています:

var excel = new ExcelQueryFactory(file);
var data = from c in excel.Worksheet(0)
            select c;
var dataList = data.ToList();

List<FullImportExcel> importList = new List<FullImportExcel>();
foreach (var s in dataList.ToArray())
{
    if ((s[0].ToString().Trim().Length < 6) && (s[1].ToString().Trim().Length < 7))
    {
        FullImportExcel item = new FullImportExcel();
        item.Carrier = s[0].ToString().Trim();
        item.FlightNo = s[1].ToString().Trim();
        item.CodeFlag = s[2].ToString().Trim();

        //etc etc (50 more columns here)

        importList.Add(item);
    }
}

PlannerEntities context = null;
context = new PlannerEntities();
context.Configuration.AutoDetectChangesEnabled = false;
int count = 0;

foreach (var item in importList)
{
    ++count;
    context = AddToFullImportContext(context, item, count, 100, true);
}

private PlannerEntities AddToFullImportContext(PlannerEntities context, FullImportExcel entity, int count, int commitCount, bool recreateContext)
{
      context.Set<FullImportExcel>().Add(entity);

      if (count % commitCount == 0)
      {
          context.SaveChanges();
          if (recreateContext)
          {
              context.Dispose();
              context = new PlannerEntities();
              context.Configuration.AutoDetectChangesEnabled = false;
          }
      }
      return context;
}

これは問題なく動作しますが、それほど速くはありません。また、毎月最低 200 万行のインポートを行う必要があります。一括インポートのためのより良い方法はありますか? EF を完全に回避し、SQLConnection を使用してそのように挿入する方がよいでしょうか?

ありがとう

4

3 に答える 3

3

X個のレコードごとにのみレコードをコミットする方法が気に入っています(あなたの場合は100です)。

私は最近、月に一度、一度に 50,000 件以上のレコードのステータスを更新する必要があるシステムを作成しました。これは、各レコードを更新し、更新された各レコードに監査レコードを挿入することです。

もともとこれはエンティティ フレームワークで作成したもので、タスクのこの部分を実行するのに 5 ~ 6 分かかりました。SQL プロファイラーは、100,000 件の SQL クエリを実行していることを示しました。レコードごとに 1 つの UPDATE と 1 つの INSERT です (予想通り)。

これを、レコード ID のコンマ区切りリスト、ステータス、およびユーザー ID をパラメーターとして受け取るストアド プロシージャに変更しました。このストアド プロシージャは、一括更新とそれに続く一括挿入を行います。これには 5 秒かかります。

あなたの場合、この数のレコードについては、BULK IMPORT ファイルを作成し、それを SQL に渡してインポートすることをお勧めします。

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

于 2012-06-14T14:06:27.767 に答える
2

SQL Server での大量の挿入については、一括コピーが最速の方法です。SqlBulkCopyクラスを使用して、コードから一括コピーにアクセスできます。リストの IDataReader を作成する必要があります。または、このIDataReader を使用して、私が作成した汎用リストを挿入することもできます。

于 2012-06-14T15:05:43.000 に答える
0

頭を上げてくれたAndyに感謝します-これはSQLで使用されるコードであり、これまでに役立つPinalDaveの助けを借りて-http ://blog.sqlauthority.com/2008/02/06/sql-server-import- csv-file-into-sql-server-using-bulk-insert-load-comma-delimited-file-into-sql-server / :)

DECLARE @bulkinsert NVARCHAR(2000)
DECLARE @filepath NVARCHAR(100)
set @filepath = 'C:\Users\Admin\Desktop\FullImport.csv'
SET @bulkinsert = 
    N'BULK INSERT FullImportExcel2s FROM ''' + 
    @filepath + 
    N''' WITH (FIRSTROW = 2, FIELDTERMINATOR = '','', ROWTERMINATOR = ''\n'')'

EXEC sp_executesql @bulkinsert

コードに組み込むにはまだ少し作業が必要ですが、50000行では1時間ではなく25秒に短縮されているため、大幅に改善されています。

于 2012-06-14T15:02:59.800 に答える