高分求解决dom4j一次写入2W条数据内存溢出,在线等

dilaomimi 2007-06-07 10:01:39
dom4j有一个write Element的方法,在循环中写入文件的话,没有根节点和文件头,想问问各位有没解决办法,以下是部分代码:
public class FriendsViewByTableName
{

private XMLWriter writer = null;

//调用dom4j中的一个类来解决中文问题,在得到writer时把format传进去
OutputFormat format = OutputFormat.createPrettyPrint();

public void viewData(Adm_chgtmp adm)
{
/** 指定XML编码 */
format.setEncoding("GBK");

String tableName = null;
String columnName = null;
String columnValue = null;

Element friendElement = null;
Element ageElement = null;
Document document = null;
String sql = "";
String sql1 = "";

ResultSet rs = null;
ResultSet rs1 = null;
dbcon connect = null;

String TMPID = adm.getTMPID();
String TMPDESC = adm.getTMPDESC();
String ALLROWS = adm.getALLROWS();
String MARKISNEW = adm.getMARKISNEW();
String DELETEON = adm.getDELETEON();
String TMPDATA =adm.getTMPDATA();
String ISNEW = adm.getISNEW();
Timestamp LASTUPDATE = adm.getLASTUPDATE();

List list = stringToken(TMPDATA);
Iterator it = list.iterator();
try
{
document = DocumentHelper.createDocument();

Element friendsElement = document.addElement("DATA");

//document.setRootElement(friendsElement);

// try {
// writer.processingInstruction("xml version=\"1.0\"", "encoding=\"GBK\"");
// } catch (SAXException e1) {
// // TODO Auto-generated catch block
// e1.printStackTrace();
// }
while(it.hasNext())
{
tableName = (String)it.next();
sql ="select * from " + tableName +" where ISNEW = 1 ";
sql1 = "select * from syscolumns where id=object_id('"+ tableName + "')" ;
try{
connect = new dbcon();
rs = connect.executeQuery(sql);
rs1 = connect.executeQuery(sql1);
rs1.last();
int row = rs1.getRow();
String column[] = new String[row];
rs1.beforeFirst();


System.out.println(row);

while(rs1.next())
{
for(int i=0;i<row;i++)
{
column[i] = rs1.getString("name");
rs1.next();
}
}




while(rs.next())
{
friendElement = friendsElement.addElement(tableName);

for(int i = 0;i<column.length;i++)
{
columnName = column[i];

columnValue = rs.getString(columnName);
System.out.println("列名:"+columnName);
System.out.println("值:"+columnValue);
ageElement = friendElement.addElement(columnName);
ageElement.setText((columnValue+"").toString().trim());
}

// writer.write(friendElement);
// friendElement.clearContent();//释放这个Element的空间,不然会导致内存耗尽
//friendsElement.clearContent();
}
//writer.write(friendsElement);

} catch( SQLException e){
e.printStackTrace();

} catch( Exception e){
e.printStackTrace();

}
finally
{
try
{
if(rs!=null)
rs.close();
if(rs1!=null)
rs1.close();
connect.closeConnect();
}
catch(SQLException e)
{
e.printStackTrace();

}

}
writer = new XMLWriter(new FileWriter(new File("C:/exp/friend.xml"),true),format);
writer.write(document);
System.out.println("创建文件成功");

}

} catch (IOException e)
{
e.printStackTrace();
}
finally
{
if(writer != null)
{
try
{
writer.close();
}
catch(Exception err)
{
err.printStackTrace();
}
}
}


}
public List stringToken(String tableName)
{
List list = new ArrayList();
StringTokenizer stok = new StringTokenizer(tableName,",");
while(stok.hasMoreElements())
{
list.add(stok.nextToken());
}
return list;
}
}

...全文
449 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
anhy 2007-06-11
  • 打赏
  • 举报
回复
sax.read(new File("c:/exp/friend.xml"));
改为
sax.read(new FileInputStream("c:/exp/friend.xml"));
或sax.read(new FileReader("c:/exp/friend.xml"));
试试

如果还不行,建议调大JVM内存
dilaomimi 2007-06-11
  • 打赏
  • 举报
回复
dom4j是支持sax的,我现在也是用的SAX,代码如下,请您帮我看看,万分感谢
public static void main(String args[])
{
SAXReader sax = new SAXReader();
sax.addHandler("/DATA/user01", new UserHandler());
try {
sax.read(new File("c:/exp/friend.xml"));
} catch (DocumentException e) {
e.printStackTrace();
}
}
public static class UserHandler implements ElementHandler
{
Element e = null;
public void onStart(ElementPath path) {
e = path.getCurrent();
path.addHandler("USERID", new NameHandler());
path.addHandler("FNAME", new NameHandler());
path.addHandler("ORGID", new NameHandler());
path.addHandler("ORGNAME", new NameHandler());
path.addHandler("FROMORG", new NameHandler());
System.out.println(path.getPath()+"***************************");
//System.out.println(e.getName()+":"+e.getText());

}
public void onEnd(ElementPath path) {
path.removeHandler("USERID");
path.removeHandler("FNAME");
path.removeHandler("ORGID");
path.removeHandler("ORGNAME");
path.removeHandler("FROMORG");
}

}
public static class NameHandler implements ElementHandler
{
Element e = null;

public void onStart(ElementPath path) {

System.out.println(path.getPath());
}
public void onEnd(ElementPath path) {
e = path.getCurrent();
System.out.println(e.getName()+":"+e.getText());

}
anhy 2007-06-07
  • 打赏
  • 举报
回复
请参考以下代码修改,试试:
==========================================
package arith;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import org.xml.sax.helpers.AttributesImpl;

public class FriendsViewByTableName
{

private XMLWriter writer = null;

//调用dom4j中的一个类来解决中文问题,在得到writer时把format传进去
OutputFormat format = OutputFormat.createPrettyPrint();

public void viewData(Adm_chgtmp adm)
{
/** 指定XML编码 */
format.setEncoding("GBK");

String tableName = null;
String columnName = null;
String columnValue = null;

Element friendElement = null;
Element ageElement = null;
Document document = null;
String sql = "";
String sql1 = "";

ResultSet rs = null;
ResultSet rs1 = null;
dbcon connect = null;

String TMPID = adm.getTMPID();
String TMPDESC = adm.getTMPDESC();
String ALLROWS = adm.getALLROWS();
String MARKISNEW = adm.getMARKISNEW();
String DELETEON = adm.getDELETEON();
String TMPDATA =adm.getTMPDATA();
String ISNEW = adm.getISNEW();
Timestamp LASTUPDATE = adm.getLASTUPDATE();

List list = stringToken(TMPDATA);
Iterator it = list.iterator();
try
{
writer = new XMLWriter(new FileWriter(new File("C:/exp/friend.xml"),true),format);
writer.startDocument();
AttributesImpl a = new AttributesImpl();


writer.startElement("","","DATA",a);

while(it.hasNext())
{
tableName = (String)it.next();
sql ="select * from " + tableName +" where ISNEW = 1 ";
sql1 = "select * from syscolumns where id=object_id('"+ tableName + "')" ;
try{
connect = new dbcon();
rs = connect.executeQuery(sql);
rs1 = connect.executeQuery(sql1);
rs1.last();
int row = rs1.getRow();
String column[] = new String[row];
rs1.beforeFirst();


System.out.println(row);

while(rs1.next())
{
for(int i=0;i<row;i++)
{
column[i] = rs1.getString("name");
rs1.next();
}
}




while(rs.next())
{
friendElement = DocumentHelper.createElement(tableName);

for(int i = 0;i<column.length;i++)
{
columnName = column[i];

columnValue = rs.getString(columnName);
System.out.println("列名:"+columnName);
System.out.println("值:"+columnValue);
ageElement = friendElement.addElement(columnName);
ageElement.setText((columnValue+"").toString().trim());
}
writer.write(friendElement);

}

} catch( SQLException e){
e.printStackTrace();

} catch( Exception e){
e.printStackTrace();

}
finally
{
try
{
if(rs!=null)
rs.close();
if(rs1!=null)
rs1.close();
connect.closeConnect();
}
catch(SQLException e)
{
e.printStackTrace();

}

}

}
writer.endElement("","","DATA");
writer.endDocument();
System.out.println("创建文件成功");


} catch (IOException e)
{
e.printStackTrace();
}
finally
{
if(writer != null)
{
try
{
writer.close();
}
catch(Exception err)
{
err.printStackTrace();
}
}
}


}
public List stringToken(String tableName)
{
List list = new ArrayList();
StringTokenizer stok = new StringTokenizer(tableName,",");
while(stok.hasMoreElements())
{
list.add(stok.nextToken());
}
return list;
}
}

==============================
dilaomimi 2007-06-07
  • 打赏
  • 举报
回复
数据量没有10M,大概是4M的样子,网上写10M会溢出是说DOM之类的方式,想想DOM4J怎么也是评价很高的开源包,不会连这点问题都处理不了的,主要是对API不熟,熟悉的兄弟帮忙顶啊,很急!!!
fengmingjie 2007-06-07
  • 打赏
  • 举报
回复
数据量有10M吗,网上的测试是10M的数据会溢出的,你试着调大java的stack size的大小试试,具体的方法如下
设置一下stack size的大小 java 后跟参数即可设置,具体参数如下:
-Xms size set initial Java heap size
-Xmx size set maximum Java heap size
-Xss size set java thread stack size
zhj92lxs 2007-06-07
  • 打赏
  • 举报
回复
看看
ABCatai 2007-06-07
  • 打赏
  • 举报
回复
up
dilaomimi 2007-06-07
  • 打赏
  • 举报
回复
楼上的朋友,请问你有没有例子?如果一个一个NODE输出,我的根节点可以完整的包含所有子节点吗?你仔细看我的代码,我试过输出子节点,但是这样我的文件就没了根节点,对dom4j不熟悉,望指点
anhy 2007-06-07
  • 打赏
  • 举报
回复
DOM4J支持将一个Document或任何的Node通过write方法输出
因为数据量较大建议不要在内存建立Document,而是降一个一个Node的输出
dilaomimi 2007-06-07
  • 打赏
  • 举报
回复
谢谢你,实在非常非常感谢你anhy(鎏),这个问题按照你写的已经解决了,顺便说一下,我在writer.write(friendElement);这一句后加了一句friendElement.clearContent();这样好象就是在循环里面释放了这个Element,已经不出问题了,真是太高兴了,谢谢你~~!虽说大恩不言谢,我给你分结帖拉~~~~:)
内容概要:本文围绕【语音增强】领域中的组稀疏信号去噪问题展开研究,提出了一种结合非凸正则化与凸优化理论的去噪方法,旨在提升含噪语音信号的可懂度与质量。文章系统阐述了组稀疏信号模型的构建机制,引入非凸正则项以更精确地逼近理想稀疏性,克服传统凸正则化在稀疏表达上的局限性,并采用高效的凸优化算法保障模型解的稳定性与收敛性。整个算法流程在Matlab平台上完整实现,涵盖语音信号预处理、稀疏系数解、去噪重构等关键环节,并配套提供可复现的代码资源,便于研究人员进一步验证与拓展。该方法在保留数学可处理性的同时显著增强了去噪性能,尤其适用于低信噪比环境下的语音恢复任务。; 适合人群:具备一定信号与系统、数字信号处理理论基础,熟悉稀疏表示与最优化方法,且拥有Matlab编程能力的研究生、科研人员及从事语音增强、音频工程、通信系统等相关领域的工程技术人员。; 使用场景及目标:①应用于语音通信、智能助听设备、语音识别前端等对语音质量要较高的实际系统中;②作为高校课程或科研项目中的教学案例,帮助深入理解稀疏表示、非凸优化与凸优化算法的融合机制;③为后续研究非凸正则化在图像去噪、生物医学信号处理等其他稀疏恢复问题中的性能优势提供理论依据与实现范例。; 阅读建议:建议读者结合所提供的Matlab代码逐模块分析,重点理解非凸正则项的设计动机及其对稀疏性的增强作用,深入掌握优化解过程中迭代算法的实现细节;同时可通过调整正则化参数、测试不同噪声类型(如白噪声、车间噪声)与强度的语音信号,系统评估算法的鲁棒性、收敛速度与去噪效果,从而全面把握该方法的优势与潜在局限。
内容概要:本文系统介绍了节点不连续伽辽金方法(NDG)在解线性和非线性平流方程中的一维数值实现过程,并配套提供了完整的Matlab代码实现。该方法作为一种高精度、高分辨率的数值离散化技术,特别适用于对流主导的偏微分方程解,在处理间断解和保持数值稳定性方面具有突出优势。文章详细阐述了NDG方法的核心理论基础,包括弱形式构造、局部基函数选取、数值通量处理、时间推进格式(如显式Runge-Kutta方法)以及边界件的实施策略。通过多个典型算例(如线性对流、Burgers方程等)的仿真分析,充分验证了该方法在捕捉激波、避免非物理振荡及保持高阶精度方面的有效性。结合代码实践,读者可深入掌握NDG方法的算法设计与编程实现的关键环节。; 适合人群:具备偏微分方程数值解法、有限元方法或计算流体力学基础知识,熟悉Matlab编程语言,从事科学计算、工程仿真、应用数学或相关领域研究的研究生、科研人员及工程师。; 使用场景及目标:①用于高阶数值方法的教学演示与学习,加深对间断伽辽金方法的理解;②应用于流体力学、气象模拟、环境科学等领域中对强对流现象的精确数值模拟;③作为复杂物理系统仿真中对流项高精度离散化的核心技术支撑;④为科研工作者开发定制化解器提供可复用的算法原型与代码参考。; 阅读建议:建议读者结合Matlab代码逐行调试与运行,对照理论推导理解每个模块的功能实现,重点关注数值通量、质量矩阵和刚度矩阵的构造过程。同时推荐参阅相关经典文献以深化对NDG方法数学理论和收敛性分析的理解,从而更好地将该方法迁移应用于自身研究课题中。

81,111

社区成员

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

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