Re: [問題] 請問不使用緩衝讀取,和用大量物件儲存數據的缺點?

作者: chen1025 (小陳)   2014-08-31 10:14:39
我剛開始學習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的缺陷。
: 大家有任何的建議嗎?
作者: Killercat (殺人貓™)   2014-08-31 15:31:00
singleton幫助很大 不過要注意thread safe的問題但是其他的...老實講除非你資料巨大到一個地步不然我不認為這樣有很顯著的改善。有Profile過嗎?
作者: chen1025 (小陳)   2014-08-31 16:27:00
70萬的數據並不大,可以計算多少記憶體。通常不超過500M會用爆 通常是用太多物件容器 或是內部資料型別太複雜當然xmx 也要設定
作者: baconcsie (Bacon)   2014-09-01 06:12:00
感恩不過那個單例模式還是不太懂 能否解釋的更詳細點呢?
作者: LPH66 (-6.2598534e+18f)   2014-09-01 07:59:00
就去 google 「單例模式」或者英文「Singleton pattern」
作者: adrianshum (Alien)   2014-09-06 12:07:00
Singleton 十居其九都是不必要的。
作者: Killercat (殺人貓™)   2014-09-06 15:26:00
基本上我個人認為唯一必要的就是System Context但是包含Spring在內 大家都在比濫用的....所以就...大家一起濫用吧 :D
作者: adrianshum (Alien)   2014-09-07 21:08:00
Spring 裡很少Singleton 吧。有 DI 的話,99% 的Singleton 就更加變得不必要。(這裡指的不是 Spring的 Singleton-scope 的 bean)另,這篇裡說的也不太合理。能估算大小的話,用ArrayList 配合提供 initial size的 ctor, 比直接用array 大不了大個十多二十byte. String 轉 char 也是古怪。兩者的 semantic meaning 根本不一樣。每call 一次生成一個本來就是你的設計出問題。另外你寫的 singleton 更是typical 有問題的做法.請google : java singleton lazy initialization
作者: Killercat (殺人貓™)   2014-09-07 21:26:00
我很少在Spring裡面「合理」使用@Autowire的.....
作者: adrianshum (Alien)   2014-09-07 21:26:00
你那堆所謂改善,我稱為 premature optimization
作者: Killercat (殺人貓™)   2014-09-07 21:27:00
不過我贊同你的說法,我自己本身除了context外基本上是不用singleton的Autowire...難道跟singleton是不同東西嗎? XD
作者: adrianshum (Alien)   2014-09-09 18:05:00
Autowire 和 singleton 要扯上關係實在有點牽強
作者: baconcsie (Bacon)   2014-09-12 06:04:00
推樓上們!! 讓我受益良多

Links booklink

Contact Us: admin [ a t ] ucptt.com