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