SQL Bulk Copyを使用して~370万行を挿入すると、OutOfMemory例外がスローされます。

c# sqlbulkcopy sql-server

質問

私はSqlBulkCopyを使って約370万行を挿入し、エラーをスローする

'System.OutOfMemoryException'型の例外がスローされました

ここに私のコードです。列は動的に追加されます。それ以外の場合は、直進コードです。

using (var bulkCopy = new SqlBulkCopy(connection))
{
    connection.Open();

    using (var reader = ObjectReader.Create(inputRecordsToProcess))
    {
        bulkCopy.BatchSize = 100000;
        bulkCopy.BulkCopyTimeout = 0;
        bulkCopy.DestinationTableName = schemaName + "." + tableName;

        var classProperties = GetClassPropertiesByAttributes<T>();
        var i = 0;

        foreach (var property in classProperties)
        {
            bulkCopy.ColumnMappings.Add(property.Item2, property.Item1);
            i++;
        }

        try
        {
            bulkCopy.WriteToServer(reader);
        }
        catch (Exception ex)
        {
            throw;
        }
    }
}

1つの重要な点は、私は360万行を挿入することができましたが、それを超えると例外がスローされることです。コードを変更する必要がありますか?

これはすべてのサーバー(dev、prod、さらにはローカル)で発生します。

人気のある回答

あなたのお返事ありがとうございました。

私は問題が何かを考え出した。まず、SQL Bulk Copyを呼び出すと発生しませんでした。これは、以前の実行では、現在のレコードよりも1000以下のレコードを実行できたため、SQLの一括コピーには制限があると考えられたためです多数のレコードを処理するための設定が必要です。私はコードをデバッグしたときに、データベースの挿入を呼び出す前にメソッド呼び出しがあることが判明しました。「オブジェクト型を強い型に変換する」という意味です。つまり、強い型オブジェクトに変換する必要がある動的クラスオブジェクトがあります。そのメソッド内の変換するすべてのレコードが失敗します。しかし、それでも、その方法は300万件を超えるレコードで早期に機能しました。

だから、グーグルでは、私は原因が "32ビット"プラットフォームであることが分かった。アプリケーションは「任意のCPU」で実行するように設定されていましたが、「 32ビット優先 」がチェックされています。チェックを外すと、SQLバルク・コピーを使用してレコードを実行し、データベースに挿入できました!

私はこのリンクの答えに行ったとき、私はそれを変更しましたhttps://social.msdn.microsoft.com/Forums/en-US/ace563e2-66fe-4666-9f04-cbfc90ab59bc/system-out-of-memory-exception-due -to-mismanaged-memory-using-threads?forum = csharplanguage

私の記事を読む時間を取ってくれてありがとう!感謝します!



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ