💾

SqlBulkCopyとCsvHelperで大規模CSVを効率的にSQL Serverにインポートする方法

2024/10/15に公開

解法

C#で大規模なCSVファイルを効率よくSQL Serverにインポートするには、SqlBulkCopyCsvHelperを組み合わせて使用します。この方法により、大量のデータをメモリに一度に読み込むことなく、逐次的にインサートすることが可能です。

以下の手順で実現します:

  1. CsvDataReaderを使ってCSVファイルを逐次的に読み込みます。
  2. SqlBulkCopyを利用して、読み込んだデータをSQL Serverにバルクインサートします。
using var streamReader = csvFile.OpenText();
using var csvReader = new CsvReader(streamReader, new CsvConfiguration(CultureInfo.InvariantCulture));
using var csvDataReader = new CsvDataReader(csvReader);

using var bulkCopy = new SqlBulkCopy(connection)
{
    DestinationTableName = $"{schemaName}.{tableName}" // 挿入先テーブル名を設定
};
await bulkCopy.WriteToServerAsync(csvDataReader); // データを逐次的にインサート

解説

この方法では、CsvDataReaderを使うことで、逐次的にデータを読み込みながらSqlBulkCopyでインポートします。これにより、CSV全体を一度にメモリに展開する必要がなくなり、メモリ使用量を大幅に削減できます。

手順の詳細

  1. ファイルストリームとCsvHelperの準備

    • ファイルを開き、StreamReaderCsvReaderを使ってCSVを読み込みます。
    • CsvDataReaderは、CsvHelperが提供するIDataReaderインターフェースの実装で、SqlBulkCopyと組み合わせて使うことができます。
  2. SqlBulkCopyを使用したバルクインサート

    • SqlBulkCopyは、SQL Serverに対して大量のデータを高速に挿入するためのクラスです。
    • WriteToServerAsyncメソッドを使って、非同期でデータを逐次的にインポートします。

補足情報

  • CsvHelperライブラリは、CSVファイルを扱うための強力でシンプルなツールであり、データを読み込みながらそのままSqlBulkCopyに渡すことが可能です。
  • この方法により、CSVファイルが大規模でも、サーバーのメモリを圧迫することなく効率的にインポートできます。
  • メモリ効率を考慮した処理を行うため、大量データを扱うETL(抽出・変換・ロード)処理にも適しています。

Discussion