日期:2014-05-20  浏览次数:20759 次

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可以这样,导出一部分数据之后关闭流

之后在原有基础上追加··

可以试试