讀取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
狀況:單元測試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