版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
java千万级别数据生成文件思路和优化博客分类:
java大数据处理javajava大数据java数据处理千万级别数据
一年前写过一个百万级别数据库数据生成配置xml文件的程序,程序目的是用来把数据库里面的数据生成xml文件.程序可以配置多少文件生成到一个文件中去.
程序刚开始设计的时候说的是最多百万级别数据,最多50W数据生成到一个xml文件里面去,所以在做测试的时候自己也只是造了100W的数据并没有做过多数据量的测试,然后问题就来了....由于程序使用的局点数据量巨大,需要生成xml文件的客户资料接近千万级别的程度,而现场对程序的配置大约是100W条数据生成一个xml文件里面去,程序在这样的大数据量下面偶尔会有崩溃.
最近几天现场催的比较紧,最近抽空把这个问题处理了一下,在解决问题的过程中我把解决的步骤和方法记录了下来,正好和大家共享一下
现场提的问题概况:
数据量:生成xml,每个文件100W+条的数据
内存控制:最好不要超过512M
问题详情:在处理70W左右的时候内存溢出一、先来看一下程序要生成的xml文件的结构Xml代码
<File>
<FileType>1</FileType>
<RType>12</RType>
<Version>03</Version>
<BNo>004</BNo>
<FileQ>5</FileQ>
<FNo>0006</FNo>
<RecordNum>1000000</RecordNum>
<!--
上面是文件头
下面是百万个<RecordList>
-->
<RecordList>
<Msisdn>10350719507</Msisdn>
<State>1</State>
<StartDate>20110303</StartDate>
<Date>20110419</Date>
<Balance>45000</Balance>
</RecordList>
...
<!--
可能百万个
<RecordList>
块-->
</File>
二、给大家说一下如何把大数据生成xml文件
1、小数据量的情况下
<
1W条数据
比较好用的方法是使用开源框架,比如XStream直接把javabean生成xml
优点:api操作简单,方便维护
缺点:数据量大的情况下太消耗内存
2、大数据量生成一个xml文件(本程序采用的方法)
自己做的一个可以使用极少的内存生成无限制大的xml文件框架由3部分生成xml文件
第一部分:生成文件头
例如:xxx.toXML(Objectobj,StringfileName)
第二部分:通过每次向文件里面追加3000(可配置)条数据的形式生成文件块
5、专门把批处理代码提取出来通过JProfile内存分析.最终问题定位完毕.
原因如下:100W数据生成一个文件的过程中,等文件生成完毕之后才能把数据库中的数据备份到历史表中,这个时候才能进行事务的提交,也就是执行commit(),并且删除原表数据,100W数据按照3000一批写入文件,每批次只是通过PreparedStatement.addBatch();加入到批次里面去,并没有执行PreparedStatement.executeBatch(),而是在commit()之前统一调用的PreparedStatement.executeBatch(),这样的话PreparedStatement就会缓存100W条数据信息,造成了内存溢出.错误的方法如下:Java代码
try{
conn.setAutoCommit(false);
pst
=
conn.prepareStatement(insertSql);
pstDel
=
conn.prepareStatement(delSql);
pstUpdate
=
conn.prepareStatement(sql);
...
//totalSize
=
100W数据
/
3000一批次
for
(int
i
=
1;
i
<=
totalSize;
i++)
{
client.appendXML(list);
}
//
错误的使用方法
client.finishXML();
pst.executeBatch();
pstDel.executeBatch();
}
...
finally
{
try
{
if
(isError)
{
conn.rollback();
}
else
mit();
...
}
...
}
正确的方法如下
try{Java代码
conn.setAutoCommit(false);
pst
=
conn.prepareStatement(insertSql);
pstDel
=
conn.prepareStatement(delSql);
pstUpdate
=
conn.prepareStatement(sql);
...
//totalSize
=
100W数据
/
3000一批次
for
(int
i
=
1;
i
<=
totalSize;
i++)
{
list
=
从数据库中查询3000条数据
client.appendXML(list);
pst.executeBatch();
pstDel.executeBatch();
}
client.finishXML();
...
inally
{
try
{
if
(isError)
{
conn.rollback();
}
else
mit();
...
}
...
如果碰到和我一样的需要给大家一个提醒.
oracle在每次执行executeBatch();进行批处理的时候,当前connection对应的rownum会根据操作的结果发生变化.
在执行pst.executeBatch();之后,当前连接的rownum数就会发生变化.因此凡是通过rownum查询数据的程序都要小心这一点java千万级别数据处理(2)-千万级别FTP下载博客分类:
Java开发经验javaFTP下载千万级别数据处理
这个也是以前做过的一个程序,目的主要是去ftp主机(最多100左右)去取xx数据文件.
千万级别只是个概念,代表数据量等于千万或者大于千万的数据
本分享不牵扯分布式采集存储之类的.是在一台机器上处理数据,如果数据量很大很大的话,可以考虑分布式处理,如果以后我有这方面的经验,会及时分享的.1、程序采用的ftp工具,apache的commons-net-ftp-2.0.jar
2、千万级别ftp核心关键的部分--列目录到文件,只要是这块做好了,基本上性能就没有太大的问题了.
可以通过apache发送ftp命令"NLST"的方式列目录到文件中去
#ftp列目录执行的命令以环境变量的配置优先,不配置则使用默认的列目录方式NLSTJava代码
#
DS_LIST_CMD
=
NLST
public
File
sendCommandAndListToFile(String
command,String
localPathName)
throws
IOException
{
try
{
return
client.createFile(command,
localPathName);
}
catch
(IOException
e)
{
log.error(e);
throw
new
IOException("the
command
"+command
+"
is
incorrect");
}
}
当然应该还有其他形式的,大家可以自己研究一下
十万级别以上的数据量的话千万不要使用下面这种方式,如果用的话====找死
FTPFile[]dirList=client.listFiles();
3、分批次从文件中读取要下载的文件名.
加载到内存中处理,或者读取一个文件名就下载一个文件,不要把所有的数据都加载到内存,如果很多的话会出问题
为啥要分批次?
因为是大数据量,如果有1000W条记录,列出来的目录文件的大小1G以上吧4、文件下载的核心代码----关于文件的断点续传,获得ftp文件的大小和本地文件的大小进行判断,然后使用ftp提供的断点续传功能
下载文件一定要使用二进制的形式
client.enterLocalPassiveMode();//设置为被动模式
ftpclient.binary();
//一定要使用二进制模式
Java代码
/**
下载所需的文件并支持断点续传,下载后删除FTP文件,以免重复
*
@param
pathName
远程文件
*
@param
localPath
本地文件
*
@param
registerFileName
记录本文件名称目录
*
@param
size
上传文件大小
*
@return
true
下载及删除成功
*
@throws
IOException
*
@throws
Exception
*/
public
boolean
downLoad(String
pathName,
String
localPath)
throws
IOException
{
boolean
flag
=
false;
File
file
=
new
File(localPath+".tmp");//设置临时文件
FileOutputStream
out
=
null;
try{
client.enterLocalPassiveMode();//
设置为被动模式
client.setFileType(FTP.BINARY_FILE_TYPE);//设置为二进制传输
if(lff.getIsFileExists(file)){//判断本地文件是否存在,如果存在并且长度小于FTP文件的长度时断点续传;返之新增
long
size
=
this.getSize(pathName);
long
localFileSize
=
lff.getSize(file);
if(localFileSize
>
size){
return
false;
}
out
=
new
FileOutputStream(file,true);
client.setRestartOffset(localFileSize);
flag
=
client.retrieveFile(new
String(pathName.getBytes(),client.getControlEncoding()),out);
out.flush();
}
else{
out
=
new
FileOutputStream(file);
flag
=
client.retrieveFile(new
String(pathName.getBytes(),client.getControlEncoding()),out);
out.flush();
}
}catch(IOException
e){
log.error(e);
log.error("file
download
error
!");
throw
e;
}finally{
try{
if(null!=out)
out.close();
if(flag)
lff.rename(file,
localPath);
}catch(IOException
e){
throw
e;
}
}
return
flag;
}
/**
*
获取文件长度
*
@param
fileNamepath
本机文件
*
@return
*
@throws
IOException
*/
public
long
getSize(String
fileNamepath)
throws
IOException{
FTPFile
[]
ftp
=
client.listFiles(new
String(fileNamepath.getBytes(),client.getControlEncoding()));
return
ftp.length==0
?
0
:
ftp[0].getSize();
}
检测本地文件是否已经下载,如果下载文件的大小.
/**
*本地文件的
获取文件的大小
*
@param
file
*
@return
*/
public
long
getSize(File
file){
long
size
=
0;
if(getIsFileExists(file)){
size
=
file.length();
}
return
size;
}
5、因为程序要跑最多100多个线程,在线程监控上做了一些处理,可以
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《 以α-羟基酸铈为前驱体制备二氧化铈及其性能的研究》范文
- 《 不同放牧强度对锡林郭勒草甸草原群落及植物功能性状的影响》范文
- 通信设备在电子商务交易的安全保障考核试卷
- 酒吧服务饮品市场营销策略分析考核试卷
- 陶瓷生产设备维护与管理考核试卷
- 医疗设备租赁行业发展趋势考核试卷
- 地质勘探中的安全风险评估考核试卷
- 舟山市普陀山庄有限公司招聘笔试题库2024
- 中石油云南石化有限公司招聘笔试题库2024
- 中石油共享运营有限公司招聘笔试题库2024
- 全球卫生治理课件
- 大学生安全教育(综合篇)学习通课后章节答案期末考试题库2023年
- 《中外教育史》教案
- 风机沉降观测报告
- 1961年至2012世界各国城镇化率数据
- 幼儿园大班社会课件认识国旗国徽
- 其他类中药的鉴定
- 中国书法史2023章节测试答案-中国书法史超星尔雅答案
- 2023年高考真题天津卷版含答案
- 项目式学习在高中语文思辨性阅读与表达教学中的运用 论文
- 北斗创新设计导航知到章节答案智慧树2023年山东大学
评论
0/150
提交评论