2017-01-23 1 views
2

Я использую 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 и даже местных)

+0

- это то, что вы используете Jackson 'ObjectReader'? выполняет ли стек вызовов в исключении любую информацию о том, связано ли это с чтением или записью? уже есть похожие вопросы (например, http://stackoverflow.com/q/12819151/1132334), но все они связаны с проблемами с источником данных. – dlatikay

+0

Если бы я должен был догадаться, я бы сказал, что это может быть ошибкой в ​​реализации читателя, который вы используете. Можете ли вы предоставить более подробную информацию об этом в вопросе в качестве редактирования? –

+0

Спасибо всем за ваши комментарии, я попытался отлаживать больше сфокусированных (чего я не делал, прежде чем ставить этот вопрос), я вижу, что ошибка возникает при преобразовании типов объектов. Я пытаюсь преобразовать тип объекта в сильный тип DTO, а в цикле foreach он выбрасывает ошибку исключения памяти. Я пытаюсь найти способ, будет держать вас в курсе. Цените весь свой ответ, это дает некоторый удар моему мозгу, чтобы также думать о южной стороне :) – superachu

ответ

1

Спасибо всем за ваш ответ.

Я выяснил, в чем была проблема. Во-первых, это не произошло при вызове SQL Bulk Copy, который, как я предполагал, мог быть из-за того, что в предыдущем запуске я смог запустить меньше 1000 записей меньше, чем текущий, поэтому я думал, что SQL Bulk Copy имеет ограничения или нужны настройки для обработки большого количества записей. Когда я отлаживал код, я обнаружил, что есть вызов метода перед вызовом вставки базы данных для «преобразования типа объекта в сильный тип», то есть у меня есть объект динамического класса, который мне нужно преобразовать в объект с сильным типом, поэтому я петлю все записи в этом методе для преобразования, и он не работает. Но тем не менее этот метод работал раньше с более чем 3 миллионами записей.

Итак, после поиска в Интернете я обнаружил, что виновником была «32-разрядная» платформа. Приложение было настроено на запуск в «Any CPU», но был отмечен флажок «Предпочитаете 32-разрядный». Когда я снял флажок, я смог запустить записи и вставить в базу данных с помощью SQL Bulk Copy!

Когда я пошел через ответить на этот Линка, я изменил его 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

Спасибо всем за время, чтобы читать через мой пост! Ценить это!

Смежные вопросы