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

看板java作者 (小陳)時間10年前 (2014/08/31 10:14), 10年前編輯推噓3(3029)
留言32則, 5人參與, 最新討論串2/2 (看更多)
我剛開始學習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

08/31 15:31, , 1F
singleton幫助很大 不過要注意thread safe的問題
08/31 15:31, 1F

08/31 15:31, , 2F
但是其他的...老實講除非你資料巨大到一個地步
08/31 15:31, 2F

08/31 15:31, , 3F
不然我不認為這樣有很顯著的改善。有Profile過嗎?
08/31 15:31, 3F

08/31 16:27, , 4F
70萬的數據並不大,可以計算多少記憶體。通常不超過500M
08/31 16:27, 4F

08/31 16:30, , 5F
會用爆 通常是用太多物件容器 或是內部資料型別太複雜
08/31 16:30, 5F

08/31 16:55, , 6F
當然xmx 也要設定
08/31 16:55, 6F

09/01 06:12, , 7F
感恩
09/01 06:12, 7F

09/01 06:25, , 8F
不過那個單例模式還是不太懂 能否解釋的更詳細點呢?
09/01 06:25, 8F

09/01 07:59, , 9F
就去 google 「單例模式」或者英文「Singleton pattern」
09/01 07:59, 9F

09/06 12:07, , 10F
Singleton 十居其九都是不必要的。
09/06 12:07, 10F

09/06 15:26, , 11F
基本上我個人認為唯一必要的就是System Context
09/06 15:26, 11F

09/06 15:27, , 12F
但是包含Spring在內 大家都在比濫用的....
09/06 15:27, 12F

09/06 15:27, , 13F
所以就...大家一起濫用吧 :D
09/06 15:27, 13F

09/07 21:08, , 14F
Spring 裡很少Singleton 吧。有 DI 的話,99% 的
09/07 21:08, 14F

09/07 21:08, , 15F
Singleton 就更加變得不必要。(這裡指的不是 Spring
09/07 21:08, 15F

09/07 21:08, , 16F
的 Singleton-scope 的 bean)
09/07 21:08, 16F

09/07 21:09, , 17F
另,這篇裡說的也不太合理。能估算大小的話,用
09/07 21:09, 17F

09/07 21:10, , 18F
ArrayList 配合提供 initial size的 ctor, 比直接用
09/07 21:10, 18F

09/07 21:23, , 19F
array 大不了大個十多二十byte. String 轉 char 也是
09/07 21:23, 19F

09/07 21:23, , 20F
古怪。兩者的 semantic meaning 根本不一樣。
09/07 21:23, 20F

09/07 21:24, , 21F
每call 一次生成一個本來就是你的設計出問題。
09/07 21:24, 21F

09/07 21:25, , 22F
另外你寫的 singleton 更是typical 有問題的做法.
09/07 21:25, 22F

09/07 21:25, , 23F
請google : java singleton lazy initialization
09/07 21:25, 23F

09/07 21:26, , 24F
我很少在Spring裡面「合理」使用@Autowire的.....
09/07 21:26, 24F

09/07 21:26, , 25F
你那堆所謂改善,我稱為 premature optimization
09/07 21:26, 25F

09/07 21:26, , 26F
^看到
09/07 21:26, 26F

09/07 21:26, , 27F
@Killercat: Autowiring 又是另一課題了....
09/07 21:26, 27F

09/07 21:27, , 28F
不過我贊同你的說法,我自己本身除了context外
09/07 21:27, 28F

09/07 21:27, , 29F
基本上是不用singleton的
09/07 21:27, 29F

09/07 21:28, , 30F
Autowire...難道跟singleton是不同東西嗎? XD
09/07 21:28, 30F

09/09 18:05, , 31F
Autowire 和 singleton 要扯上關係實在有點牽強
09/09 18:05, 31F

09/12 06:04, , 32F
推樓上們!! 讓我受益良多
09/12 06:04, 32F
文章代碼(AID): #1K0eKHqg (java)
文章代碼(AID): #1K0eKHqg (java)