SqlBulkCopy実行時のメモリリーク

c# sql sqlbulkcopy

質問

私は、次のコードで発生する悪いメモリリークが発生しています:

 public void BulkInsert(string tableName, IDataReader reader, String connectionString)
    {
        using (var connection = new SqlConnection(connectionString))
        {
            connection.Open();
            using (var bulkCopy = new SqlBulkCopy(connection))
            {
                bulkCopy.DestinationTableName = tableName;
                bulkCopy.BulkCopyTimeout = 900;

                try
                {
                    bulkCopy.WriteToServer(reader);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                finally
                {
                    reader.Close();
                }
            }
        }
    }

このコードセグメントは何千回も実行されるため、メモリ不足例外が発生するまでにわずか1分かかります。 Antsは、これがIDataReaderによって指し示された行がGCによって収集されていないためであると報告しています。しかし、私が次の行をコメントアウトすると、コードのこの断片に問題がどのように孤立しているのかが漏れなくなります。

bulkCopy.WriteToServer(reader);

誰にもメモリリークを防ぐ方法についての提案はありますか?

前もって感謝します。

コーリングコード:

 var reader = datatable.CreateDataReader();
 BulkInsert(tablename, reader, connectionString);
 reader.Dispose();
 datatable.Dispose();

受け入れられた回答

私は自分自身の質問に答えることは絶対に嫌いですが、最終的に解決策を見つけましたが、私はこの間違いを愚かに感じましたが、誰かがこの質問に遭遇した場合の回答として投稿したかったので、

メモリリークは、提供されたコードセグメントではありませんでした。実際、リークではありませんでした。

パフォーマンス分析を見ると、私はBulkCopy呼び出しが私の全プログラムのボトルネックであることがわかりました。私はProducer-ConsumerパターンをDataTablesに挿入して挿入します。

私はメモリプロファイラが私にコードを実行したときに処分されていないDataTableオブジェクトを表示していると思った。これらは実際には挿入待ちのキューイングテーブルですが、テストデータを再利用していたため、キューに入れられたテーブルは既にDBにありました(既に挿入されているようです)。

私が実際にボトルネックを取り除いていたBulkCopyラインをコメントアウトすることで、DataTableがすぐに処分されていたため、メモリプロファイラに問題は見られませんでした。これはBulkcopyラインが間違っているように見えるようにしました。

私がBulkCopyコードを1秒の遅れで置き換えたとき、これではボトルネックはありませんでした。 BulkCopyを5秒の遅れで置き換えたのは、消費者プロデューサのキューサイズが制御不能になっていることに気付いたからです。なぜ私はすぐにメモリ不足になったのですか?

この質問に時間を割くすべての人に感謝します。もっと面白い答えがなかったのは残念です。


人気のある回答

GCが回収するためには、読者を処分する必要があるかもしれません。 finallyブロックでDisposeを呼び出そうとしました。

finally
{
    //reader.Close();
    reader.Dispose();
}


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