java 从数据库中导出大量数据 生成txt文件,内存溢出
String sql = "SELECT PHONE_NO PHONE_NO,USER_ID USER_ID FROM "+ tableName ;try {
dbaction.getConn();
Statement stmt = dbaction.con.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()){
String userIdExt = userId.substring(userId.length()-2, userId.length());
smallFileName = time + "_"+userIdExt+".txt";
writerSml = new BufferedWriter(new FileWriter(smallFileName,true));
writerSml.write(phoneNo+"|"+userId+"\r\n");
writerSml.flush();
writer.close();
writerSml.close();
}
1、需求:从数据库中读取百万级的记录,(包括用户手机号、用户id)取出后按照userid后两位分(00-99)生成100不同的txt文件。
2、以上是代码,程序运行一段时间后,当取数过多的时候导致系统内存溢出,
问题: 1、怎么优化下代码能够减少系统内存的使用。
2、怎么优化下代码提高系统的效率。
java io java文件生成 java内存溢出 --------------------编程问答-------------------- 你这数据太多了!全部塞到内存中不爆才怪啊。
查询一次不要太多,查一次写一次文件。分多次查询。文件尽量满多少M分割文件 --------------------编程问答-------------------- 分批次的查询吧。。不然内存。。难以满足你 --------------------编程问答-------------------- 多次查询吧。一次太多了 --------------------编程问答-------------------- 分批查 --------------------编程问答-------------------- 太多了...分批次吧 --------------------编程问答-------------------- 你是要按userid的后两位写文件的,所以写个循环,分批次查询就好了啊。
如果还是不行,就用rownum。 --------------------编程问答-------------------- 你确定你的内存是在这段代码里溢出的么?jdbc的resultset和你的操作都是流操作,正常情况下应该是不会有大量内存占用的,去分析一下你溢出的内存的占用情况吧 --------------------编程问答-------------------- 我刚搞了跟你差不多功能的问题,主要是你没有分页去处理,将sql语句分页处理,每10000条或者20000条记录查询一次(这个得根据你写入文件的字符串的长度,如果记录太多字符串有可能超出最大长度,你这里我觉得每次执行100000条记录都没问题),然后写入到文件中再进行下一次操作,就不会出现内存溢出的问题了 --------------------编程问答-------------------- Opening --------------------编程问答-------------------- 分批次查询试试 --------------------编程问答-------------------- 每次循环就执行writerSml.write(phoneNo+"|"+userId+"\r\n");由于数据量太大,导致内存溢出,建议分批次查询导出。
--------------------编程问答-------------------- 写个定时器,每次导出若干条,修改状态位 --------------------编程问答-------------------- 读1000条写1000条。
做定时器,化整为零。 --------------------编程问答-------------------- 你的statement没释放,当然内存会溢出……
这种文件见过好多了
String sql = "SELECT PHONE_NO PHONE_NO,USER_ID USER_ID FROM "+ tableName ;
Statement stmt = null;
try {
dbaction.getConn();
stmt = dbaction.con.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()){
.....
}
catch(Exception e) {
}
finally {
if (stmt != null){
stmt.close();
}
// connection,也要在这里释放,如果是连接池的,则是还回池中.
// 其实所有的文件读写的close,都是最好放在finally 块中。
} --------------------编程问答--------------------
同意 --------------------编程问答--------------------
同意,这个问题应该是连接没有关闭导致的内存溢出,跟写入根本没有关系。
查询和写入都是流操作,不是导致内存溢出 --------------------编程问答-------------------- 这种问题在一开始,就应根据你的数据量的来考虑查询方式了,同时使用分批次跟分页,不管什么样的东东,单个文件太大肯定会导致系统慢耜用内存多,可用内存截越小,数据处理就更慢,最终肯定就是内存溢出了. --------------------编程问答-------------------- 这个吧,你从数据库那就得先处理。
1、需求:从数据库中读取百万级的记录,(包括用户手机号、用户id)取出后按照userid后两位分(00-99)生成100不同的txt文件。
----------------------
先截取userid后两位 然后分组并统计一下。 看看每组有多少计录,然后再一批一批的取。
补充:Java , Java EE