2017-01-23 38 views
2

我用SqlBulkCopy的插入大約370萬行,並拋出錯誤使用SQL批量複製插入〜370萬行拋出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; 
     } 
    } 
} 

其中重要的一點是,我能夠插入〜360萬行,但是當它越過拋出異常。我需要對代碼進行任何更改嗎?

這種情況發生的所有服務器(DEV,督促,甚至地方)

+0

是你正在使用的jackson'ObjectReader'嗎?在例外情況下的調用堆棧是否會泄露與讀取或寫入有關的任何信息?已經有一些類似的問題(如http://stackoverflow.com/q/12819151/1132334),但它們都與數據源的問題有關。 – dlatikay

+0

如果我不得不猜測,我會說這可能是您正在使用的閱讀器的實現中的一個錯誤。你能否在問題中提供更多關於它的細節? –

+0

感謝您的意見,我試圖調試更集中(我沒有做這個問題之前),我看到轉換對象類型時發生錯誤。我試圖將對象類型轉換爲強類型DTO,並在foreach循環中引發內存異常錯誤。我試圖找出一個辦法,會讓你張貼。欣賞你的所有迴應,它給我的大腦一些啓發,也想在南側:) – superachu

回答

1

謝謝大家對你的迴應上。

我想出了什麼問題。首先,它在調用SQL批量複製時沒有發生,我認爲它可能是因爲在以前的運行中,我能夠運行少於1000個記錄而不是當前記錄,所以我認爲SQL批量複製有限制或需要設置以處理大量記錄。當我調試代碼時,我發現在調用數據庫插入到「將對象類型轉換爲強類型」之前有一個方法調用,意思是說,我有一個動態類對象,我需要將它轉換爲強類型對象,所以我循環該方法中的所有記錄都要進行轉換,並且在那裏失敗。但是,這種方法早些時候有超過300萬條記錄。

所以google搜索後,我發現的罪魁禍首是「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

感謝大家抽出寶貴的時間來閱讀經過我的帖子!欣賞它!