2 chc570806038 chc570806038 于 2013.05.09 10:34 提问

导出 大量数据内存溢出,

在 本机上用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
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:839)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    com.trajectory.manager.controller.filter.SessionPrivaligeFilter.doFilter(SessionPrivaligeFilter.java:79)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)


root cause 

java.lang.OutOfMemoryError: Java heap space
    java.lang.StringCoding$StringEncoder.encode(StringCoding.java:232)
    java.lang.StringCoding.encode(StringCoding.java:272)
    java.lang.String.getBytes(String.java:946)
    com.trajectory.behaviorportrait.controller.ExportSiletUserPortraitController.writeWeekTxtWeek(ExportSiletUserPortraitController.java:209)
    com.trajectory.behaviorportrait.controller.ExportSiletUserPortraitController.handleRequestInternal(ExportSiletUserPortraitController.java:69)
    org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
    org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    com.trajectory.manager.controller.filter.SessionPrivaligeFilter.doFilter(SessionPrivaligeFilter.java:79)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

1个回答

yongyong_21
yongyong_21   2013.05.10 10:28
已采纳

你创建了一个非常大的字符串,然后又转换成一个非常大的 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(); // 

不需要使用很多内存。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
海量数据导出解决内存溢出问题csv txt格式
/** *  * @param path * @param sql  查询数据的sql语句 * @param colTitleList 表头 * @param connName  查询的数据库 * @param tempPath  临时存放目录  要正确 * @param emax * @param response * @param fileName 文件名 * @param
解决java poi海量数据导出内存溢出问题
找了很多天的解决方法,一直被分页查询绕进去了,其实数据都能查出来的,真正卡的地方是ExcelExportUtil类下调错了方法。最开始调用的是这个方法,最主要的地方就是我标记的地方  workbook = new HSSFWorkbook();和workbook = new XSSFWorkbook();我先说说这两个方法作用:1.HSSFWorkbook:是操作Excel2003以前(包括200...
java海量数据导出xls分页解决报内存溢出问题
/**      * 写XLS文件      * @param fileName 文件名(全路径)      * @param colTitleList 标题      * @param colPorpertyList 如果属性列 为NULL,则resultData 中的每个元素为一个LIST      * @param resultData 数据      * @throws Exc
POI生成excel数据量大时内存溢出解决
通过SXSSFWorkbook替换XSSFWorkbook                 File file = new File(Constants.WEB_ROOT                         + "templet/price.xlsx");                 if (!file.exists()) {               
大数据导出Excel导致内存溢出的解决方案
一、问题描述: 公司之前的项目中客户有一个需求是将业务数据导出到Excel表中,方便他们对账,单个导出任务数据量近100W,每当月初任务量多时,导出的项目就会内存溢出,挂掉。二、原因分析: 1、每个进程在写Excel文件时,都是先将数据加载到内存,然后再将内存里面的数据生成文件;因此单个进程任务的数据量过大,将无法及时回收系统内存,最终导致系统内存耗尽而宕机。 2、导出中ora
phpexcel 处理大量数据时内存溢出
方法1、扩大php默认分配内存 ini_set("memory_limit", "13312M"); set_time_limit(0); 方法2、使用缓存 、、、、、
解决大批量数据导出Excel产生内存溢出的方案
解决大批量数据导出Excel产生内存溢出的方案
java解决大批量数据导出Excel产生内存溢出的方案
java解决大批量数据导出Excel产生内存溢出的方案
使用POI3.8导出大数据excel方法(解决内存溢出)
工作中遇到大数据导出excel内存溢出的问题,在使用jxl和POI3.8之前的版本都找不到很好的解决办法,通过设置jvm内存效果也不理想。但是在POI3.8以上版本中提供了SXSSFWorkbook的新类,可以通过参数设置常驻内存中的行数,防止OOM异常! 但是SXSSFWorkbook仅仅支持excel2007格式,也就是说SXSSFWorkbook只支持.xlsx格式,不支持.xls格式。在
JAVA解决大批量导出数据到excel产生内存溢出的方案
<br />下面的代码使用POI3.1,合并11个3000多行的文档用时约6秒Java代码 @SuppressWarnings("unchecked")   public class XlsMergeUtil {     private static Logger logger = LoggerFactory.getLogger(XlsMergeUtil.class);       /**     * 将多个Xls文件合并为一个,适用于只有一个sheet,并且格式相同的文档     * @param inp