为了账号安全,请及时绑定邮箱和手机立即绑定

导出 大量数据内存溢出,

导出 大量数据内存溢出,

隔江千里 2019-03-13 18:19:47
在 本机上用eclipse导出一百多万的数据导出,没有问题,但是部署在应用服务器上就会内存溢出,而且我把本机的tomcat也拷贝过去了。其它一个功能,比这数据还多几W,只不过少写出了几个字段,也能正常导出。int totalSize = behaviorPortraitService.querySiletUserPortraitCountMonth(sietUserPortraitForm.getParams());                  int pageNum = 0;                    if (totalSize % 1000000 == 0) {                        pageNum = totalSize / 1000000;                    }else{                        pageNum = totalSize / 1000000 + 1;                    }                 write.append("                         年/月                                       IMSI                                  手机号码                            沉默天数                       开卡时间"                         + enter);                 outSTr = response.getOutputStream(); // 建立                 buff = new BufferedOutputStream(outSTr);                 // 循环总页数,得到每页的页数                 for (int i = 1; i <= pageNum; i++) {                     // 根据页数,得到 PageResult对象                     list = behaviorPortraitService.exportSiletUserPortraitMonth(sietUserPortraitForm.getParams(),i,100000);                     // 循环List集合进行写入                     for (int j = 0; j < list.size(); j++) {                         // 循环集合,写入数据到TXT中                         write.append(list.get(j).getBegin_endtime());                         write.append("  " + list.get(j).getImsi());                         write.append("  " + list.get(j).getMsisdn());                         write.append("  "+ list.get(j).getSilencedays());                         write.append("  " + list.get(j).getStarttime()                                 + enter);                     }                     // 写完一个分页对象之后,清空List,清楚缓存                     list.clear();                     System.gc();                 }             buff.write(write.toString().getBytes("UTF-8"));错误信息:org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.OutOfMemoryError:  Java heap space
查看完整描述

1 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

你创建了一个非常大的字符串,然后又转换成一个非常大的 byte[]。
我建议把数据逐步写入输出流,不用使用 write.append,只使用二进制的 buf.write,如果你想写文本,使用下面的代码:

PrintWriter pw = new PrintWriter(new OutputStreamWriter(
                 new BufferedOutputStream(socket.getOuptutStream()), "UTF-8"));

pw.print( some text here );
pw.print( some more ext here );
pw.println( the end of the line );

pw.close(); //

不需要使用很多内存。


查看完整回答
反对 回复 2019-04-28
  • 1 回答
  • 0 关注
  • 848 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信