求jxl OutOfMemory错误解答

stone_lee 2005-08-29 03:45:03
做excel导出,数据很多,列也很多。估计现在行*列的值在140万,以后会更加的多。由于项目要求,必须全部导出表中的数据。但我用jxl发现,当数据多时,会报OutOfMemory的错误。我做过一个test测试,jxl处理500000没有问题,但处理1000000就会出现OutOfMemory错误了。
可以肯定是jxl的问题,但我不明白怎么jxl没有对象释放的方法呢???
测试代码:
jxl.write.WritableWorkbook wwb = null;
jxl.write.Label labelC = null;

try {
wwb = Workbook.createWorkbook(new File("c:\\1.xls"));
for(int i=0;i<50000;i++) {
wwb = Workbook.createWorkbook(os);
for(int j=0;j<100;j++) {
labelC = new jxl.write.Label(j, i, "This is a Label cell1");
}
}
wwb.write();

}
catch (Exception e)
{
System.out.println(e);
}
finally {
try {
os.close();
wwb.close();
}
catch(Exception e) {
System.out.println(e);
}
}
...全文
474 16 打赏 收藏 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
stone_lee 2005-09-07
  • 打赏
  • 举报
回复
好热闹的回复,放弃了jxl,用的csv分次写入,虽然慢,不过内存控制在10M内,问题已经解决了,谢谢大家。
个人认为,jxl对于大数据量的导入导出还是存在缺点的,支持5M的数据一次导入导出,但因为jxl提供的write()只能提交一次,而开大内存,个人认为确实可以解决问题,但显然不佳,我导100多万条数据出来,既然要150M的内存,如果用排版函数,内存更多。有时间研究一下它的代码。
homesos 2005-08-31
  • 打赏
  • 举报
回复
说滴有道理
那这个问题岂不是不容易处理了
xdop 2005-08-31
  • 打赏
  • 举报
回复
如果程序执行到 wwb.write(); 才真正写文件
labelC只不过是依次指向各个jxl Label的句柄而已
将它置null或者主动调用gc()过程都是徒劳的

在没有执行wwb.write()之前有没有生成文件?
mxlmwl 2005-08-31
  • 打赏
  • 举报
回复
呵呵,是你的内存不够用了啊,这么搞的话迟早会outofmemory的。一个方法是加大你的jvm内存设置,还有就是你找找,看看jxl有没有分批写入的功能,实际上jxl一次写入的方法是对的,这样才可以达到高效,但缺点就是容易把你的内存吃光。你找找看,如果能分批,比如每10000条写一次到文件,这就好处理了。我想应该可以实现吧?你每10000条写一次,同时记住当前的行数,然后下次从这行开始写就是了,应该可以达到你的要求。
stone_lee 2005-08-30
  • 打赏
  • 举报
回复
不关GC的问题。
ws.addCell(labelC); 只符labelC = null,其实ws对象根本还没有清空。
stone_lee 2005-08-30
  • 打赏
  • 举报
回复
不管用。仍然还是报内存溢出的错误。
jxl.write.WritableWorkbook wwb = null;
jxl.write.Label labelC = null;
jxl.write.WritableSheet ws = null;
int iCount = 0;
try {
wwb = Workbook.createWorkbook(new File("c:\\1.xls"));
ws = wwb.createSheet("Test Sheet 1", 0);
for(int i=0;i<50000;i++) {
if(iCount>5000) {
iCount=0;
labelC = null;
System.gc();
}
for(int j=0;j<100;j++) {
labelC = new jxl.write.Label(j, i, "This is a Label cell1");
ws.addCell(labelC);
}

iCount++;

}
wwb.write();


}
catch (Exception e)
{
System.out.println(e);
}
finally {
try {
wwb.close();
}
catch(Exception e) {
System.out.println(e);
}
}
homesos 2005-08-30
  • 打赏
  • 举报
回复
不知这样如何:
for(int i=0;i<50000;++i)
{
for(int j=0;j<100;++j)
{
ws.addCell(new jxl.write.Label(j, i, "This is a Label cell1"));
//也可用下面滴,不知效果会如何
//labelC = null;
//labelC = new jxl.write.Label(j, i, "This is a Label cell1");
    //ws.addCell(labelC);
}
System.gc();
}
homesos 2005-08-30
  • 打赏
  • 举报
回复
可以将循环中滴判断去掉,用别滴方法来取代,这样可以提高循环滴效率
homesos 2005-08-30
  • 打赏
  • 举报
回复
//楼上说滴对,最好能及时写入文件,老占着内存,早晚肯定会出问题滴
//下面滴可能只会起部分作用,恐怕不会从根本上改变局面,必竟内存是有限滴

for(int i=0;i<50000;++i)
{
if(iCount>5000)//根据内存测试结果进行调整为宜
{
iCount=0;
System.gc();
}

for(int j=0;j<100;++j)
{
ws.addCell(new jxl.write.Label(j, i, "This is a Label cell1"));
//也可用下面滴,不知效果会如何
//labelC = null;
//labelC = new jxl.write.Label(j, i, "This is a Label cell1");
    //ws.addCell(labelC);
}

iCount += 1;
}
flyxxxxx 2005-08-30
  • 打赏
  • 举报
回复
看看WritableWorkbook及其它的对象有没有flush方法,有的话就在相应位置调用,也就是要将数据及时输出到文件中,不能一直放在内存中。
homesos 2005-08-30
  • 打赏
  • 举报
回复
if(iCount>5000) {
iCount=0;
labelC = null;
System.gc();
}
----------------------------
我倒……
把labelC = null;放在这里,有意义???


homesos 2005-08-29
  • 打赏
  • 举报
回复

wwb = Workbook.createWorkbook(os);//这句生成的是什么
wwb = Workbook.createWorkbook(new File("c:\\1.xls"));//这句生成的是什么
homesos 2005-08-29
  • 打赏
  • 举报
回复
一直在生成新的Label对象,却没有发现明确将不用的对象标出。
labelC = null;有利于系统及时有效地回收垃圾。

适当调用System.gc()也是很有效的。
stone_lee 2005-08-29
  • 打赏
  • 举报
回复
我在标头声明jxl.write.Label labelC = null;在循环中调用,对象就只有1个,我觉得问题出在
labelC = new jxl.write.Label(j, i, "This is a Label cell1");
ws.addCell(labelC); --问题的原因,加入的对象太多
但好像jxl没有提供ws.clear()释放对象的函数哦
homesos 2005-08-29
  • 打赏
  • 举报
回复
最大限度的共用对象,如果不需要时及时置为null,
最好不要在for循环中用new运算符,尽量用赋值进行替代
将for(int j=0;j<100;j++)改为 for(int j=0;j<100;++j) 或 由递增改为递减
在操作N次后或是隔N久后进行一下System.gc() [n自定,视内存测试结果而定]
flyylf 2005-08-29
  • 打赏
  • 举报
回复
能不能把这个文件分成两个或多个呢。我觉得这个问题不号解决。
【变分多谐波对偶模式追踪】从噪声信号中提取重复瞬态分量的方法(Matlab代码实现)内容概要:本文介绍了“变分多谐波对偶模式追踪”这一信号处理方法,旨在从含有噪声的信号中有效提取重复出现的瞬态成分。该方法结合了变分模态分解与多谐波分析的优势,通过构建对偶模式追踪模型,实现了对微弱瞬态特征的精准分离与增强,特别适用于机械故障诊断、生物医学信号处理等领域。文中详细阐述了算法原理、数学模型构建及其实现步骤,并提供了基于Matlab的代码实现,便于读者复现与应用。; 适合人群:具备一定信号处理基础,从事机械故障诊断、生物医学工程或相关领域的研究生及科研人员。; 使用场景及目标:①从强噪声背景中提取机械设备的周期性冲击信号以进行故障预警;②分析生物医学信号中的重复生理事件,如心电图或脑电图中的特定波形;③为需要高精度瞬态特征提取的研究提供可靠的算法支持与实现范例。; 阅读建议:此资源以Matlab代码实现为核心,不仅展示了算法的具体编程细节,还强调了理论与实践的紧密结合。学习者应在理解算法原理的基础上,动手运行并调试所提供的代码,通过改变参数观察结果变化,从而深入掌握该方法的应用技巧与优化策略。
内容概要:本文围绕“数据驱动下光伏建筑群源荷不确定性解析及其储能多目标低碳经济调度研究”展开,提出了一种融合数据驱动方法与多目标优化算法的综合调度框架。研究首先基于历史数据对光伏发电出力与建筑用电负荷的不确定性进行建模,通过场景生成与削减技术提取典型运行场景,并采用概率预测方法精确刻画源荷波动特征。在此基础上,构建了涵盖经济性、低碳性及系统运行稳定性等多重目标的储能优化调度模型,并引入NSGA-II等先进多目标进化算法求解Pareto最优解集,实现储能系统的协同优化与灵活调度。文中还基于Python语言完整实现了从数据预处理、不确定性建模、优化建模到算法求解的全流程,并通过具体仿真案例验证了所提方法在降低系统运行成本、提升可再生能源消纳水平、减少碳排放等方面的综合效益。; 适合人群:具备一定电力系统基础知识和Python编程能力,从事新能源调度、综合能源系统优化或低碳技术研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于光伏建筑群等分布式能源系统的储能优化调度;②支撑多目标优化在能源系统中的实践,实现经济与环保双重目标的平衡;③为相关课题研究提供可复现的代码框架与技术路线参考。; 阅读建议:建议读者结合文中提供的Python代码,深入理解不确定性建模、场景生成、多目标优化建模与求解的具体实现过程,并可通过调整参数或引入新模型进行拓展研究。

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧