作者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/cn.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