我刚开始学习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的缺陷。
: 大家有任何的建议吗?
singleton帮助很大 不过要注意thread safe的问题但是其他的...老实讲除非你资料巨大到一个地步不然我不认为这样有很显著的改善。有Profile过吗?
70万的数据并不大,可以计算多少内存。通常不超过500M会用爆 通常是用太多物件容器 或是内部资料型别太复杂当然xmx 也要设定
感恩不过那个单例模式还是不太懂 能否解释的更详细点呢?
作者:
LPH66 (-6.2598534e+18f)
2014-09-01 07:59:00就去 google “单例模式”或者英文“Singleton pattern”
基本上我个人认为唯一必要的就是System Context但是包含Spring在内 大家都在比滥用的....所以就...大家一起滥用吧 :D
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
我很少在Spring里面“合理”使用@Autowire的.....
你那堆所谓改善,我称为 premature optimization
不过我赞同你的说法,我自己本身除了context外基本上是不用singleton的Autowire...难道跟singleton是不同东西吗? XD
Autowire 和 singleton 要扯上关系实在有点牵强