使用SQL批量复制插入~370万行抛出OutOfMemory异常

时间:2017-01-23 17:07:44

标签: c# sql-server sqlbulkcopy

我使用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;
        }
    }
}

重要的一点是,我能够插入 ~360万行,但是当它超过它时抛出异常。我是否需要对代码进行任何更改?

这种情况发生在所有服务器上(dev,prod甚至本地)

1 个答案:

答案 0 :(得分:1)

谢谢大家的回复。

我弄清楚问题是什么。首先,它在调用SQL批量复制时没有出现,我认为这可能是因为,在之前的运行中,我能够运行少于当前的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

感谢大家花时间阅读我的帖子!欣赏它!