💾
SqlBulkCopyとCsvHelperで大規模CSVを効率的にSQL Serverにインポートする方法
解法
C#で大規模なCSVファイルを効率よくSQL Serverにインポートするには、SqlBulkCopyとCsvHelperを組み合わせて使用します。この方法により、大量のデータをメモリに一度に読み込むことなく、逐次的にインサートすることが可能です。
以下の手順で実現します:
-
CsvDataReader
を使ってCSVファイルを逐次的に読み込みます。 -
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全体を一度にメモリに展開する必要がなくなり、メモリ使用量を大幅に削減できます。
手順の詳細
-
ファイルストリームと
CsvHelper
の準備- ファイルを開き、
StreamReader
とCsvReader
を使ってCSVを読み込みます。 -
CsvDataReader
は、CsvHelper
が提供するIDataReader
インターフェースの実装で、SqlBulkCopy
と組み合わせて使うことができます。
- ファイルを開き、
-
SqlBulkCopy
を使用したバルクインサート-
SqlBulkCopy
は、SQL Serverに対して大量のデータを高速に挿入するためのクラスです。 -
WriteToServerAsync
メソッドを使って、非同期でデータを逐次的にインポートします。
-
補足情報
-
CsvHelperライブラリは、CSVファイルを扱うための強力でシンプルなツールであり、データを読み込みながらそのまま
SqlBulkCopy
に渡すことが可能です。 - この方法により、CSVファイルが大規模でも、サーバーのメモリを圧迫することなく効率的にインポートできます。
- メモリ効率を考慮した処理を行うため、大量データを扱うETL(抽出・変換・ロード)処理にも適しています。
Discussion