Я использую SqlBulkCopy вставить около 3,7 миллиона строк и бросает ошибкуИспользование SQL Bulk Copy, чтобы вставить ~ 3,7 миллиона строк бросает исключение OutOfMemory
исключение типа «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;
}
}
}
один важный момент, я был в состоянии вставить ~ 3,6 миллиона строк, но бросает исключение, когда он идет по этому поводу. Нужно ли вносить какие-либо изменения в код?
Это происходит на всех серверах (Dev, Prod и даже местных)
- это то, что вы используете Jackson 'ObjectReader'? выполняет ли стек вызовов в исключении любую информацию о том, связано ли это с чтением или записью? уже есть похожие вопросы (например, http://stackoverflow.com/q/12819151/1132334), но все они связаны с проблемами с источником данных. – dlatikay
Если бы я должен был догадаться, я бы сказал, что это может быть ошибкой в реализации читателя, который вы используете. Можете ли вы предоставить более подробную информацию об этом в вопросе в качестве редактирования? –
Спасибо всем за ваши комментарии, я попытался отлаживать больше сфокусированных (чего я не делал, прежде чем ставить этот вопрос), я вижу, что ошибка возникает при преобразовании типов объектов. Я пытаюсь преобразовать тип объекта в сильный тип DTO, а в цикле foreach он выбрасывает ошибку исключения памяти. Я пытаюсь найти способ, будет держать вас в курсе. Цените весь свой ответ, это дает некоторый удар моему мозгу, чтобы также думать о южной стороне :) – superachu