C_Sharp 板


LINE

===前情提要=== 目前在重整資料庫的資料(約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 請版上先知指教,謝謝 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.82.219.136
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_Sharp/M.1468566664.A.390.html
1F:→ ssccg: Parallel.ForEach? 07/15 15:13
2F:→ ssccg: 順便說一下你方案C不叫多執行緒+dispose,你用了Wait()就是 07/15 15:14
3F:→ ssccg: 把目前的執行緒block到該Task完成後才跑下一個StartNew 07/15 15:16
4F:→ ssccg: 同時間就是只有單執行緒 07/15 15:16
5F:→ moumou17: 難怪會被打回原形,還是得等task完成工作 07/15 15:17
6F:→ moumou17: 感謝提點!請問Parallel.ForEach,建議與Task並用嗎? 07/15 15:18
補充方案D,感謝各位
7F:→ ssccg: 最上面說錯了,Parallel.ForEach跟Task是一樣的... 07/15 15:34
8F:→ ssccg: 應該要先看方案B問題是出在哪,應該不是Task沒有釋放資源 07/15 15:35
9F:→ moumou17: 或許是新增Task的速度大於Task執行完成的速度? 07/15 15:37
10F:→ moumou17: 但是task不像threadpool有數量的限制... 07/15 15:37
11F:→ ssccg: 如果是新增速度大於完成速度,可能要調整已經在等待執行的 07/15 15:38
12F:→ ssccg: Task數量太多,就先暫停新增的動作 07/15 15:38
13F:→ ssccg: Task底層應該還是用ThreadPool做,所以應該不是Thread太多 07/15 15:38
14F:→ ssccg: 是排在queue上的Task太多 07/15 15:41
將迴圈改為Parallel.ForEach 工作A處理效能:500up筆/秒,緩慢增加 工作B處理效能:230up筆/秒,緩慢增加 記憶體有增長,但是成長的量不大,且有明顯回收記憶體的現象,持續觀察~ 非常感謝!
15F:推 cplusplus: 開幾個task持續處理資料不要新開就行了吧~ 你這方式 07/15 15:53
16F:→ cplusplus: 感覺額外負擔太大了...@@ 07/15 15:53
的確是..之後會試著把Task在迴圈外宣告 然後迴圈內加入新工作 感恩!
17F:→ enonrick: task 無限增生? 就算你程式夠強吃得下,你還是會卡在IO 07/15 15:54
18F:→ enonrick: 導致整個程序卡住。最好的作法是把資料分成chunk,每個 07/15 15:55
19F:→ enonrick: chunk 限制筆數,把chunk丟到 thread 去跑,再視情況調 07/15 15:56
20F:→ enonrick: 整thread 的數量 07/15 15:57
21F:→ enonrick: 但就算方案A ,一秒只有20筆,是不是有什麼誤會.. 07/15 15:59
切chunk的方式我有想過,但是資料庫資料蠻不連續的 可能需要用第A筆至第B筆來切 速度的部分,目前是連線去呼叫資料庫,查詢時間略久,每做一次查詢回傳約1xx毫秒 一個工作內會做1~4次查詢 感謝你的建議與問題~~ ※ 編輯: moumou17 (111.82.219.136), 07/15/2016 16:06:00
22F:→ Litfal: 你的bound在資料庫(I/O bound),用多執行續不太會增加效率 07/15 16:35
23F:→ Litfal: 一些情況反而會更差,就好像你同時開好幾個執行續去讀同一 07/15 16:36
24F:→ Litfal: 顆硬碟的資料一樣 07/15 16:36
25F:→ Litfal: 這種情況要做多執行續優化,不應該用件數(平行)去切割,而 07/15 16:40
26F:→ Litfal: 是要依工作類型(垂直)去切。 07/15 16:40
27F:→ cplusplus: 同意樓上,如果你一個工作內容要存取4次DB,應該有其他 07/15 17:12
28F:→ cplusplus: 方式可以減少DB存取的次數,有機會提高更多效率 07/15 17:13
29F:推 sorkayi: Parallel.For 速度超快的 越多核心越快 07/16 09:46







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:WOW站內搜尋

TOP