需求描述:商戶每天會定時將檔案傳到我們的sftp伺服器,我們需要對檔案解析落庫等操作。
方案a的設計本來是沒問題的,因為商戶每天回傳的檔案不過5mb左右,程式執行了一年多時間,直到後來對接了乙個新商戶a,a回傳的檔案每天都在增長,有一天達到了200+mb,當程式將整個檔案載入到記憶體時直接把cpu打滿,最後記憶體溢位了,於是發現原先的方案已不適用,需要馬上修改,此時引入了多執行緒,也就是方案b。
方案b上線後,200mb檔案處理很輕鬆,不再有記憶體溢位的情況,後續觀察發現還有問題:隨著檔案增長,每天解析檔案時伺服器的cpu會越來越高,從100+mb到200mb,cpu使用率已經從34到了50,隨著時間推移,很快又會出現之前的問題,多執行緒雖然可以不再一次性載入整個檔案,但如果讀取檔案速度快,落庫等操作慢時,還是存在很多資料同時載入到記憶體中,此時又想到了乙個解決方案c。
方案c:問題還是檔案過大導致的,多執行緒解析是正常的,那麼怎麼可以讓檔案儘量減少同時載入到記憶體的數量呢?想到是否可以讓多執行緒處理資料時不要有太多佇列等待,處理一部分再讀取一部分,不要一直讀取到結束,然後排隊等待處理,也就是讓多執行緒處理完前面的資料時再繼續讀取檔案,此時引入了乙個執行緒安全的類atomiclong,每次開啟乙個多執行緒時,計數,保持正在執行的多執行緒數量不超過設定的最大值,當多執行緒到達最大值時,讓主線程等待,直到多執行緒數量降低到最大值以下時再分配乙個執行緒,多執行緒執行完再將數量減1。
方案c使用後,發現cpu不會一下飆高了,在等待時會降下來,讀取時會漲上去,但也不會漲到之前那麼高,而且處理的速度反而比之前更快了。
一次Sql語句的優化實戰之旅
資料量很大,優化前差不多2分鐘,優化後1s.低效sql select col1,col2,col3 from table where id in 1,2,3,4,5 高效sql select col1,col2,col3 from table where id 1 union allselect c...
為多執行緒當一次鎖匠
在單執行緒程式中,每次只能做一件事情,後面的事情也需要等待前面的事情完成後才可以進行,如果使用多執行緒程式,雖然能夠實現多處理,但是會發生兩個或以上的執行緒搶占資源的問題,在這個時候就要引進執行緒安全了。先看個例子 public class test1 implements runnablecatc...
hadoop hadoop的一次讀取
一次hadoop的read getfilesystem public static filesystem getfilesystem throws exception configuration configuration基本就是乙個空物件。新增了2個配置檔案到資源列表。adddefaultreso...