java千万级别数据处理_第1页
java千万级别数据处理_第2页
java千万级别数据处理_第3页
java千万级别数据处理_第4页
java千万级别数据处理_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论