求大神幫忙優化一下,10000數據還可以,但是數據一多網頁就崩潰了,就是代碼中的row++,加上去就不行了
結果是內存益處了
那就是你的程序太耗費資源了。
那個獲取page的方法:
1--Page對象村的東西太多了,很多何你寫入單元格的數據沒關系,
既然這塊邏輯是大數據量的,為什麼不拆分針對這塊邏輯的結構呢?
使用Page造成了很大的內存浪費
在循環外部定義這個結構
List list = null
2--將方法的參數精簡下
因為你一頁的數據量10000時固定的,所以只要知道這個當前的count就夠了
為什麼不把方法簽名寫成下面的呢?
arrearA..Service.getArrearInfoByRow(row,"list,arreAmount",SqlO....)
只要四個參數就夠了。
至於其他的參數對於這個xxxService來說,在生成這個Service的時候這個10000是知道的。
map,你第一行程序就有用map作為計算,應該在裡面計算的同時保存住map的信息。
方法參數越多,方法調用的成本越高,尤其是那些存有大量數據的對象作為方法參數時不可取的。
至於為什麼要改成List呢?
首先:因為你那個Page對象裡買的東西太多,很多何這塊邏輯每關系,所以不要為了易於使用
就全部封裝在一起,這樣的對象占用資源厲害啊
其次每次調用一個方法都返回一個Page對象也不合適,返回肯定是new了,對象的空間沒有復用
與其你返回一個Page,還不如在參數中定義一個page,這樣這個方法不new了,每次都利用參數中的page對象的值。
你只要在循環開始給page來一個初始化就可以了
但是page仍然占用資源,使用這個List作為參數
提示:將大數據對象放到函數體內,函數執行完了會自動釋放空間的。函數的返回采用輕便的數據結構存儲
還有就是 list可以進行clear()操作。不用每次都new一個list
最後就是使用迭代器來進行循環
總結:
優化的目的就是:
1--避免大數據量的對象傳入函數內部
2--不要動不動就返回一個對象,尤其是在多次循環中,這就是多次的new
不如將返回的對象傳入參數中,使用完了之後還可以繼續復用這個對象的內存
3--結合2,可以給對象定義一個clear操作,執行完成之後給對象的存儲減負
這樣繼續使用的時候效率更高。
希望對你有幫助