我剛開始學習Java的時候,
為了處理一個資料分析問題,
把所有的資料放在單機版運算,
大約存放500萬筆資料,
大約用了20G的Ram。
那時候是一個初學者,
每一個物件裡面,所包的變數都是資料容器類別,
字串也是直接使用String.
一個變數就占用了很多記憶體。
大概就是這樣寫吧。
public class DTO{
public ArrayList<String> A=new ArrayList<>();
public TreeMap<String,String> B=new ArrayList<>();
....都利用資料容器類別....
}
後來在公司前輩的指導下,
大幅改變了寫作的習慣,
資料的變數表達,盡可能空間的使用上精簡。
例如可以用簡單的array的地方,那就估算可能的值,
不要用到ArrayList<>這種物件,
String能用char來處理,也可以用char來處理。
還有就是學會單例模式,
能夠呼叫一次的,就呼叫一次,不要每一次呼叫都要生一個。
public class A{
private A Instance=null;
public static getInstance(){
if(A==null){
Instance=new A();
}
return Instance;
}
....
}
大概改成這樣之後,
記憶體的空間就降低很多,2-3G就可以跑完。
也知道好的程式和壞的程式的差別就在這裡。
70萬筆資料,以我過往經驗,應該不會超過2G。
以上的小小經驗,給各位做一個參考,
是以前學Java的心得。
※ 引述《baconcsie (Bacon)》之銘言:
: read load,如果不使用緩衝區,除了因為直接硬碟讀寫,可能比較慢之外
: 還會有什麼缺點嗎?
: 還有就是,最近在算數據時,都會先把數據大量讀入程式,理論上就是先放入了RAM
: 這樣在運算數據時會比較快,每筆數據我用一個物件儲存,物件中約有10來個變數,
: 總共會有30萬~75萬個物件。
: 可是RAM好容易就爆掉,不知道是真的數據太大,還是我程式的缺陷,還是java的缺陷。
: 大家有任何的建議嗎?