===前情提要===
目前在重整資料庫的資料(約2,800萬筆),所以必須一筆一筆爬
資料爬出來後會做兩種處理,再建立新的資料庫
資料庫使用mongodb,先把整個collection做findall,再丟入foreach的迴圈去跑
用了兩個foreach,為省略版面,以下code只寫一個foreach作為範本
===方案A,單執行緒===
var result = coll.FindAll();
foreach(var doc in result)
{
工作!();
}
結果:
工作A處理效能:20筆/秒
工作B處理效能:10筆/秒
慢慢做記憶體跟CPU都不炸
===方案B,多執行緒===
var result = coll.FindAll();
foreach(var doc in result)
{
Task Task_CheckData = Task.Factory.StartNew(() =>
{
工作!();
});
}
結果:
工作A處理效能:900up筆/秒,持續加速
工作B處理效能:15up筆/秒,緩慢加速,資料庫效能都被工作A吃掉了
爐~心~超~載~啦~
由於一直生出新的Task,但程式又沒有適當的釋放資源,導致記憶體持續上升
吃完所有實體記憶體後執行速度很緩慢,而且也沒有釋放記憶體的情況
===方案C,多執行緒+Dispose===
var result = coll.FindAll();
foreach(var doc in result)
{
Task Task_CheckData = Task.Factory.StartNew(() =>
{
工作!();
});
Task_CheckData.Wait();
Task_CheckData.Dispose();
}
結果:
工作A處理效能:20筆/秒
工作B處理效能:10筆/秒
體悟心靈祥和ˊㄇˋ
已經變成單執行緒的形狀了
===方案D,多執行緒+ContinueWith,失敗===
var result = coll.FindAll();
foreach(var doc in result)
{
Task Task_CheckData = Task.Factory.StartNew(() =>
{
工作!();
});
Task_CheckData.ContinueWith(antecendent =>
{
Task_CheckData_Each.Dispose();
}, TaskScheduler.FromCurrentSynchronizationContext());
}
結果:
程式整個卡住不跑...
D方案比C方案早生出來
因為失敗了所以先前沒key
===問題結論===
大概出在Task的使用上
但餵狗後還是沒發現比較好的解決方案
或許是我關鍵字下錯QQ
請版上先知指教,謝謝