讀取DBF內容至DataTable時發生System.OutOfMemoryException
情境:WPF批次讀取DBF檔案至DataTable,透過SqlBulkCopy寫入至SQL Server,單一檔案最大為375M,1747583筆,測試機記憶體為16G 狀況:單元測試OK,WPF執行時記憶體逐漸增加到1.3G,發生記憶體不足的例外錯誤 方法1:完成一個DBF檔案寫入作業就回收記憶體—>NO void CollectMemory() { GC.Collect(); GC.GetTotalMemory(true); GC.WaitForPendingFinalizers(); GC.Collect(); } 因為OutOfMemory發生在讀取DBF時,尚未執行到回收記憶體 方法2:WPF專案建置取消32位元—>OK WPF專案建置預設勾選「建議使用32位元」,記憶體上限為2G,DBF的最大檔案執行時記憶體會用到2.1G,因此發生記憶體不足,儘管取消勾選即可正常執行,建議仍保留回收記憶體,避免檔案數較多時持續佔用記憶體 參考:Memory Limits for Windows and Windows Server Releases 補充~ 還有第3種方法,由於單元測試OK,代表是WPF先天上的問題,可以改由Console程式執行DBF寫入作業,WPF透過bat檔呼叫Console,避開WPF記憶體不足的狀況,亦可恢復勾選「建議使用32位元」,目前已改採此方法並搭配回收記憶體,看來效果還不錯...
Continue Reading