2015年3月30日 星期一

情境:WPF批次讀取DBF檔案至DataTable,透過SqlBulkCopy寫入至SQL Server,單一檔案最大為375M,1747583筆,測試機記憶體為16G
狀況:單元測試OK,WPF執行時記憶體逐漸增加到1.3G,發生記憶體不足的例外錯誤
image

方法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,因此發生記憶體不足,儘管取消勾選即可正常執行,建議仍保留回收記憶體,避免檔案數較多時持續佔用記憶體
SNAGHTML13c081d
image


參考:Memory Limits for Windows and Windows Server Releases

補充~
還有第3種方法,由於單元測試OK,代表是WPF先天上的問題,可以改由Console程式執行DBF寫入作業,WPF透過bat檔呼叫Console,避開WPF記憶體不足的狀況,亦可恢復勾選「建議使用32位元」,目前已改採此方法並搭配回收記憶體,看來效果還不錯

Post a Comment: