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