您的位置:首页 > 编程语言 > Java开发

关于Java文件读取效率的一点经验

2015-05-24 23:18 351 查看
问题:

用Java读入Word Vector文件,也就是格式如下的文件

行数(n),向量维数(m)

n行,每行的结果:单词 空格 m维的向量(m个浮点型数,以空格分隔)

常规做法:

File file=new File(infname);
if(file.isFile() && file.exists()){
InputStreamReader read = new InputStreamReader(new FileInputStream(file), "UTF-8");
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt = null;
for(int i = -1; (lineTxt = bufferedReader.readLine()) != null; i++){
String[] toks = lineTxt.split(" ");
if(i == -1){
if(toks.length != 2){
System.err.println("word vector start with unexpected line: " + lineTxt);
bufferedReader.close();
return false;
}
wordsCount = Integer.parseInt(toks[0]);
dimension = Integer.parseInt(toks[1]);
vectorsMatrix = new float[wordsCount][dimension];
}else {
if(toks.length != dimension + 1){
System.err.println("unexpected word vector: " + lineTxt + " at: " + i);
bufferedReader.close();
return false;
}
vocabulary.put(toks[0], i);
for(int j = 0; j < dimension; j++)
vectorsMatrix[i][j] = Float.parseFloat(toks[j + 1]);
}
}
bufferedReader.close();
return true;
}


vocabulary是一个<String, Integer> 的Map,就是一个词典,存储所有的词。一个vectorsMatrix存储所有的word vector

效果:

对于一个5G的文件,在2core,4thread,8G RAM的机器上,这种方法的读取时间是20min+,btw,java command line parameters(-Xms4000m -Xmx7000m)这个java进程的cpu占用率一直在350%以上,也就是这个进程几乎耗尽了本机所有的计算资源。这是一个非常令人吃惊的结果,20min+ 对于IO是一个不可思议的时长,现在普通的机型硬盘,5G数据的读入应该是个100s左右的时间。那为什么这么慢?

1. 由于我的n是一个700w+的数据,太多的函数调用一定会带来一定的时间开销

2.String.split函数的返回值toks会触发大量内存操作,分配和gc

3.Float.parseFloat这个函数应该是一个正则表达式相关的解析,不出意外,不是O(n),并且有上billion次的调用,这也会是一个时间开销的点。

测试:

head出来了50w行做了一个测试,

源程序:11s+

去掉split:6s+

去掉parse:6s+

去掉split和parse:3s+

此处没有深究java编译过程中javac的编译优化,仅仅直观的测试了一下

优化:

第一个想法,自然是并行化,能把parse的一半时间变成原来的k分之一也是很客观的,但为什么读入过程中CPU被占满了?

唯一合理的解释gc,于是优化gc相关的东西,这时候关注点基本是集中在想办法替换掉split上。但凭着直觉,把vocabulary相关的操作放到一个独立的循环里面了,因为对于C系列程序if else对流水线和预取是不怎么友好的。测试了一下,直接提高到3min以内!!!简直亮瞎!!!那么,为什么会提高呢?

原因:java HashMap会带来大量的gc操作,在你不断添加元素的过程中,它至少会分配大的空间,释放原来的空间,当你的map很大之后,这是一笔非常可观的开销。尤其是当两份数据同时存在的时候,会超过7000m的上限,引起内存和swap的交换。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: