java中从Excel中读入数据计算后写入txt中,数据量过大
内存溢出问题
我是用java的jxl从Excel中读出数据按列读每列5行求一次平均值,有两个问题请教大家:
问题一:程序编译以没有问题,但是数据量大些时报内存溢出错误码:
Exception in thread "main"
java.lang.OutOfMemoryError: Java heap space 问题二:我输出到文本文件中的数据是按行存放的,如何可以与Excel表相对应按列存
现将我的代码整个贴出,请高手指点
代码:
import jxl.*;
import java.io.*;
import java.lang.*;
import jxl.write.*;
class Excel2Text
{
public static void main(String[] args)
{
jxl.Workbook rwb = null;
FileOutputStream outFile=null;
try{
InputStream is = new FileInputStream("D:/jb9Test/Book1.xls");
outFile=new FileOutputStream("D:/jb9Test/test.txt");
StringBuffer str1=new StringBuffer("");
String aa="";
double sum=0;
rwb = Workbook.getWorkbook(is);
Sheet rs = rwb.getSheet(0);
//获取Sheet表中所包含的总列数
int rsColumns = rs.getColumns();
//获取Sheet表中所包含的总行数
int rsRows = rs.getRows();
for(int i=0;i<rsColumns;i++){ //读列
for(int j=0;j<rsRows;j++){ //读行
Cell cell = rs.getCell(i,j);
sum +=Double.parseDouble(cell.getContents());
// sum += Float.parseFloat(cell.getContents());浮点型
if((j+1)%5==0){
aa=String.valueOf(sum/5)+" ";
outFile.write(aa.getBytes());
sum=0;
}
}
outFile.write("\n".getBytes());
}
}catch(Exception e){
e.printStackTrace();
}finally{
//操作完成时,关闭对象,释放占用的内存空间
rwb.close();
}
}
}
------解决方案--------------------可以使用flush()来清理缓存,比如500列就清理缓存一次:if(rsColumns%500==0){outFile.flush();}
------解决方案--------------------把java虚拟机的内存调大点
------解决方案--------------------D:/jb9Test/Book1.xls有几万条数据吗?增加内存吧 xms xmx
eg:-Xms512M -Xmx1200M
------解决方案--------------------java虚拟机的内存调大
-Xms512M -Xmx1200M
------解决方案--------------------你在调整也没有用jExcel和POI都是一个单元格一个单元格获取的。就是书哦··除非你的操作结束要不然它会一直吃你内存,吃到内存爆。
导出也是一样的道理,导出太多肯定爆。
你导出的是TXT可以这样,导出一部分数据之后关闭流
之后在原有基础上追加··
可以试试