在网上找了一些资料, 有 jdom, sax, dom4j, dom 等技术。
有人说dom4j好用,我就拿dom4j来写了简单的程序。
往xml里写入到20000多一点的数据,java.lang.OutOfMemoryError 错误。
麻烦以前做过这方面工作的高手可以指点指点我这个菜鸟。
求大家帮帮忙了。
不一定要用dom4j的 只要能做出来就可以了。
先谢谢大家了。
package ctais.business.jczc.yhs.wfwzxxcx;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* Title: SAX 方式解析 XML 文件
* Description:解决大文件报OutOfMemory的问题
* Company: ****
* @author: Pagecn
* @date: YYYY-MM-DD
*/
public class SAXApp extends DefaultHandler implements Serializable {
private String LableName = ""; // 节点名称
private String LableValue = ""; // 节点值
private HashMap hm = new HashMap(); // 临时保存数据
private List list = new ArrayList(); // 保存插入的SQL语句
/**
* 根据文件路径建立 SAX解析器
* @param uri
*/
public void parseURI(String uri) {
try {
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
sp.parse(uri, this);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 开始遍历
* @throws SAXException
*/
public void startDocument() throws SAXException {
//System.out.println(" <?xml version=\"1.0\" encoding=\"GB2312\"?>");
}
/**
* 取开始节点名称
* @param namespaceURI
* @param localName
* @param rawName
* @param attrs
* @throws SAXException
*/
public void startElement(String namespaceURI, String localName, String rawName, Attributes attrs) throws SAXException {
LableName = rawName;
}
/**
* 取节点值
* @param ch
* @param start
* @param length
* @throws SAXException
*/
public void characters(char ch[], int start, int length) throws SAXException {
// 过滤回车LableValue.indexOf("\n") == -1
if (LableValue.indexOf("\n") != -1) {
LableValue = "";
}
// 处理节点值过长,出现分段读取的情况
if (LableName.equals("COL1") || LableName.equals("COL2") || LableName.equals("COL3")) {
LableValue += new String(ch, start, length);
LableValue.trim();
} else {
LableValue = new String(ch, start, length);
}
}
/**
* 取结束节点名称
* @param namespaceURI
* @param localName
* @param rawName
* @throws SAXException
*/
public void endElement(String namespaceURI, String localName, String rawName) throws SAXException {
try {
// 获得有用节点信息放入HashMap
if (!(rawName.equals("XX") || rawName.equals("ITEM"))) {
hm.put(rawName, LableValue.trim());
LableValue = "";
}
// 组装SQL
if (rawName.equals("ITEM")) {
list.add("INSERT INTO TAB_NAME (COL1,COL2,COL3)"
+ " VALUES("
+ "'" + hm.get("COL1") + "',"
+ "'" + hm.get("COL2") + "',"
+ "'" + hm.get("COL3") + "')");
hm.clear();
}
} catch (Exception e) {
e.getMessage();
}
}
/**
* 遍历结束
* @throws SAXException
*/
public void endDocument() throws SAXException {
Statement stmt = null;
Connection conn = null;
int initsize = 0;
int size = 100;
try {
// 获取数据库连接
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:SID", "USER", "PASSWORD");
stmt = conn.createStatement();
initsize = stmt.getFetchSize();
stmt.setFetchSize(size);
// 批量插入数据,提高存储效率
for (int i = 0; i < list.size(); i++) {
stmt.addBatch((String) list.get(i));
}
stmt.executeBatch();
// 关闭数据库句柄
stmt.setFetchSize(initsize);
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
try {
if (stmt != null) {
if (initsize != 0) {
stmt.setFetchSize(initsize);
}
stmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException ee) {
ee.printStackTrace();
}
}
}
/**
* 测试方法
* 处理过>100M的XML文件,顺利完成,不过这种方式比较适合格式比较整齐、单一的XML文件
*/
public static void main(String args[]) {
/*
<ROOT>
<XX>
<ITEM>
<COL1/>
<COL2/>
<COL3/>
</ITEM>
</XX>
</ROOT>
*/
SAXApp st = new SAXApp();
st.parseURI("C:\\test.xml");
st.parseURI("C:\\ykk2007.xml");
}
}
最近要修改一个百万级别数据库数据生成配置xml文件的程序,修改的原因是把几百万条数据生成到一个文件中的时候经常会报内存溢出,程序经常在处理了70W条数据之后就中断退出了,经过2天的不断调试终于解决了这个问题,...
package xml;import java.io.FileOutputStream;/** * 大量数据写人xml的方法 * @author jinchun * */public class SaveXml { /** * @param args */ public static void main(String args[]
将数据批量写入数据库的需求是比较多的,方法也有很多种,在.net 里使用程序比较好的方法是使用 Bulk Copy 将大量数据复制到数据库 。如果数据源为XML文件,使用SQL BULK COPY就需要将XML数据导入到DataTable,下面...
文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些...Java和C++的区别Oracle JDK 和 OpenJDK 的对比基础语法数据类型Java有哪些数据类型switc...
发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~ 本套Java面试题大全,全的不能再全,哈哈~ 一、Java 基础 1. JDK 和 JRE 有什么区别?...
但实际中经常遇到XML格式的标注数据,在此举例:1.读取XML标注数据;2.写入TXT文件。XML标注数据如下<annotation verified="no"> <folder>suE</folder> &...
发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~ 一、Java 基础 1. JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,...
.xml后缀残留文件示例通过大量的翻阅资料,目前有两种解决方式:方式1:手动清除临时文件POI3.8并没有提供方法来清除临时文件,为此,这里可以自己手动进行清除: <dependency> ...
boost对xml的支持,可以在项目中很方便的加入xml配置文件,读写非常方便,本文从使用方面展开讲解,如果你有类似的需求,本文将会助你一臂之力。
工具类 csv工具类: package ... import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.Method;...import java.nio.charset.Charset;...import java.util.Collection...
在实际项目开发的中,经常会遇到这样的场景:由于数据量很大,会将数据批量导入到多个文件中,从而避免因单个文件数据量过大而带来不好的影响;这种场景下主要关注两个因素:第一,控制每一个文件的写入条数,一旦要...
本文主要分为两个部分:一部分是网络爬虫的概述,帮助大家详细了解网络爬虫;另一部分是HTTP请求的Python实现,帮助大家了解Python中实现HTTP请求的各种方式,以...
http://hi.baidu.com/net1979/blog/item/1829e14ee7d26c0db2de0569.html可以将二进制大对象 (BLOB) 作为二进制或字符数据写入数据库,具体视数据源的字段类型而定。若要将 BLOB 值写入数据库,请发出相应的 INSERT ...
一 -xml文件处理 文件简述 xml处理代码 遇见的问题及解决过程 i -nbsp之类的字符无法解析 ii -0xc0x11之类的字符无法解析 iii -javalangOutOfMemoryError Java heap space 二 -写到txt file工具代码io版 三 -Nio版的...
"YAML Ain't a Markup Language"(YAML不是一种置标语言)的递归缩写,早先YAML的意思其实是:"Yet Another Markup Language"(另外一种置标语言),但为了强调这种语言以数据做为中心,而不是以置标语言为重点,...
现在公司是sqlserver到mysql,要用代码实现初始化的数据搬迁工作,暴露出来初始化接口 问题描述: 数据库使用的是mybatis框架,对于有的表,例如97个字段,一百多万条数据,直接就内存溢出了。 解决办法: ① mapper...
XML(eXtensible Markup Language)是一种通用的文本格式,被广泛运用于数据交换和数据存储(虽然近年来 JSON 盛行,大有取代 XML 的趋势,但是对于一些已有系统和架构,比如 WebService,由于历史原因,仍旧会继续...
package com.excel.test; import java.io.File; import java.io.IOException; import jxl.Workbook; import jxl.write.Label; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook;...
#一、为什么使用XML 1、便于不同应用程序之间通信。 2、便于不同平台之间...xml文件内容 <?xml version="1.0" encoding="UTF-8"?> <bookstore> <book id="1"> <name>冰与火之歌</na...
在训练faster-rcnn做目标检测的时候,将数据集中的xml文件与对应图片统一重命名为VOC2007的数据格式可以避免对源代码的大量修改。 代码如下: import numpy as np import glob import os import xml.etree....
业务背景:由于需要将ngix日志过滤出来的1亿+条用户行为记录存入Hbase数据库,以此根据一定的条件来提供近实时查询,比如根据用户id及...直接hbase建表,然后读取记录文件逐条写入Hbase。由于hbase实际的写入速度远...
matlab导入数据有2中方式,一种是在命令行通过代码把数据导进去;另一种是通过matlab的数据导入向导导入。下面分布介绍这两种方法: 一、使用matlab数据导入向导 1、先来看看txt文档中保存的数据结构,如图所示...
初用SXSSFWorkbook,感觉以读写大量数据为买点...这个参数,会指定一个sheet可读取的row数目,超过该数目的row,会被写入到磁盘文件中,进而不能在通过getRow访问到,通过这种方式,内存使用空间就缩小很多了。 需...
在我们学习Python的第一天和第二天的时候我们已经把Python安装好了,环境配置也处理完毕了,今天我们就来爬数据,用Python总得做点啥是不是,今天我们先爬取网站数据,提高一下我们明天开始学基础的积极性。...
JAVA面试精选【Java基础第一部分】 JAVA面试精选【Java基础第二部分】 JAVA面试精选【Java基础第三部分】 JAVA面试精选【Java算法与编程一】 JAVA面试精选【Java算法与编程二】 ...Java高级工程师—面试(1)...数据...
我这边有个日志文件,非常的大,这边需要对这个日志文件进行数据分析, 对于每一行的数据进行处理比如ip地址相同的数据:ip:127.0.0.1 , num 22, ...并写入xml文件中,由于数据非常的大,写人的非常慢
简述 代码之路 详细分析 结束语
一、一般解析XML文件的方法有SAX和DOM、PULL(1)DOM(JAXP Crimson解析器)DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中...
javax.xml.validation ...还大量使用了 TrAX 的 javax.xml.transform.Source 接口来表示 XML 文档。简言之,SchemaFactory 读取模式文档(通常是 XML 文件)并创建 Schema 对象。Schema 创建一个 Validator 对象。最后
程序刚开始设计的时候说的是最多百万级别数据,最多50W数据生成到一个xml文件里面去,所以在做测试的时候自己也只是造了100W的数据并没有做过多数据量的测试,然后问题就来了....由于程序使用的局点数据量巨大,需要...