猿问

导出 大量数据内存溢出,

在 本机上用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
隔江千里
浏览 849回答 1
1回答

拉莫斯之舞

你创建了一个非常大的字符串,然后又转换成一个非常大的 byte[]。我建议把数据逐步写入输出流,不用使用 write.append,只使用二进制的 buf.write,如果你想写文本,使用下面的代码:PrintWriter&nbsp;pw&nbsp;=&nbsp;new&nbsp;PrintWriter(new&nbsp;OutputStreamWriter( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;BufferedOutputStream(socket.getOuptutStream()),&nbsp;"UTF-8")); pw.print(&nbsp;some&nbsp;text&nbsp;here&nbsp;); pw.print(&nbsp;some&nbsp;more&nbsp;ext&nbsp;here&nbsp;); pw.println(&nbsp;the&nbsp;end&nbsp;of&nbsp;the&nbsp;line&nbsp;); pw.close();&nbsp;//不需要使用很多内存。
随时随地看视频慕课网APP

相关分类

Java
我要回答