当前位置: 首页 > news >正文

网站怎么做滚动条广州网站设计

网站怎么做滚动条,广州网站设计,Joomla外贸网站模板,版面设计图片素材前言 最近有个项目在生产环境做数据导入时,发现开始执行导入任务会出现cpu狂飙的情况。几番定位查找发现是在读取excel的时候导致此问题的发生,因此在通常使用的为POI的普通读取,在遇到大数据量excel,50MB大小或数五十万行的级别的…

前言


      最近有个项目在生产环境做数据导入时,发现开始执行导入任务会出现cpu狂飙的情况。几番定位查找发现是在读取excel的时候导致此问题的发生,因此在通常使用的为POI的普通读取,在遇到大数据量excel,50MB大小或数五十万行的级别的数据容易导致读取时内存溢出或者cpu飙升。需要注意,本文讨论的是针对xlsx格式的excel文件上传。

关于Excel相关技术


        在Java技术生态圈中,可以进行Excel处理的主流技术包括:Apache POI,JXL,Alibaba EasyExcel等。由于JXL只支持Excel2003以下版本,所以不太常见。

Apache POI:基于DOM方式进行解析,将文件直接加载内存,所以速度较快,适合Excel文件数量不大的应用场景
Alibaba EasyExcel:采用逐行读取的解析模式,将每一行的解析结果以观察者模式通知处理(AnalyEventListener),所以比较适合数据体量较大的Excel文件解析。

问题代码


       这种方式POI会把文件的所有内容都加载到内存中,读取大的excel文件时很容易占用大量内存导致oom的发生,全部文件加载如下:

  /*** POI方式读取excel** @param file*/public static void readExcelByPoi(File file) {long start = System.currentTimeMillis();//整个文件都一块载入try (InputStream inp = new FileInputStream(file);Workbook wb = WorkbookFactory.create(inp)) {log.info("==读取excel完毕,耗时:{}毫秒,", System.currentTimeMillis() - start);Sheet sheet = wb.getSheetAt(0);//更新总数System.out.println("读取结束行数:" + sheet.getLastRowNum());} catch (Exception e) {e.printStackTrace();}}

当前引入的poi依赖

        <!-- excel工具 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.0</version></dependency>

     读取50MB我本地字段不是很多50万行数据
首先在读取excel文件的断点执行之前的cpu和内存的占用分别为50%和42%,上传的excel大小为50MB,这里我就不一一带大家测试了,以上此种方式肯定是行不通的。

解决方案一:xlsx-streamer


      我们采用分段缓存的方式加载数据到内存中,此种方式在创建Workbook对象时借助xlsx-streamer(StreamingReader) 来创建一个缓冲区域批量地读取文件 ,因此不会将整个文件实例化到对象当中,代码如下:

引入依赖:

        <!-- excel工具 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.0</version></dependency><!-- 读取大量excel数据时使用 --><dependency><groupId>com.monitorjbl</groupId><artifactId>xlsx-streamer</artifactId><version>2.1.0</version></dependency>

示例代码:

    /*** 大批量数据读取 十万级以上* 思路:采用分段缓存加载数据,防止出现OOM的情况** @param file* @throws Exception*/public static void readLagerExcel(File file) throws Exception {InputStream inputStream = new FileInputStream(file);long start = System.currentTimeMillis();try (Workbook workbook = StreamingReader.builder().rowCacheSize(10 * 10)  //缓存到内存中的行数,默认是10.bufferSize(1024 * 4)  //读取资源时,缓存到内存的字节大小,默认是1024.open(inputStream)) { //打开资源,可以是InputStream或者是File,注意:只能打开.xlsx格式的文件Sheet sheet = workbook.getSheetAt(0);log.info("==读取excel完毕,耗时:{}毫秒,", System.currentTimeMillis() - start);//遍历所有的行for (Row row : sheet) {System.out.println("开始遍历第" + row.getRowNum() + "行数据:");//遍历所有的列for (Cell cell : row) {System.out.print(cell.getStringCellValue() + " ");}System.out.println(" ");}//总数System.out.println("读取结束行数:" + sheet.getLastRowNum());}}

加载结果


40万级别数据近花费5秒,加载是不是很快了。

百万级别,也就花费7秒

前端也还做了个测试页面如下:

Excel文件上传

解决方案二:EasyExcel

     使用EasyExcel解决大文件Excel内存溢出的问题,基于POI进行封装优化,可以在不考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。

官网: https://easyexcel.opensource.alibaba.com/
github:https://github.com/alibaba/easyexcel

引入依赖

        <!--easyExcel工具--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.1</version></dependency>

示例代码


仅做简单读取示例:

 /*** EasyExcel方式读取excel* 读取并封装为对象,ExcelData大家需要的对象* @param file*/public static void readExcelByEasyExcel(File file) {long start = System.currentTimeMillis();List<ExcelData> excelDataList = EasyExcel.read(file).head(ExcelData.class).sheet(0).doReadSync();excelDataList.stream().forEach(x -> System.out.println(x.toString()));log.info("==读取excel完毕,耗时:{}毫秒,", System.currentTimeMillis() - start);}/*** EasyExcel方式读取excel* 不指定head类* @param file*/public static void readExcelByEasyExcel1(File file) {long start = System.currentTimeMillis();List<Map<Integer, String>> listMap = EasyExcel.read(file).sheet(0).doReadSync();listMap.stream().forEach(x -> System.out.println(JSON.toJSONString(x)));log.info("==读取excel完毕,耗时:{}毫秒,", System.currentTimeMillis() - start);}

   得出一个结论就是使用阿里EasyExcel确实方便很多,不仅支持excel,csv也可以。支持的文件类型更多些,但是第一种方式也还可以,毕竟poi我们也一直在使用。

http://www.tj-hxxt.cn/news/25755.html

相关文章:

  • 宝鸡网站建设网站全球搜索
  • 网站开发需要多久seog
  • 顺德网站制作公司哪家好微博推广平台
  • 建立自己的网站怎么发帖子做推广
  • WordPress源码带会员中心系统中国seo公司
  • 别人用我的备案信息做网站成人教育机构排行前十名
  • c 可以做哪些网站2024年重大新闻简短
  • 做网站编辑的时候没保存怎么新手怎么引流推广推广引流
  • 在线做行测的网站软件开发公司经营范围
  • 月嫂网站建设方案seo技术顾问阿亮
  • 网站建设创业公司策划方案推广网站的方法
  • 域名停靠性百度首页优化
  • 做一个网站难不难宁波如何做seo排名优化
  • 建网站龙如何做网络推广
  • 网站升级中html网站更新seo
  • 北京微网站建设公司哪家好免费换友情链接
  • 网站开发 语音网络营销策略实施的步骤
  • pc端网站开发微博推广价格表
  • 上海市网站开发磁力最好用的搜索引擎
  • 服装网都有哪些网站灵宝seo公司
  • 网架公司股价seo的基本步骤是什么
  • 阿里妈妈网站怎么做高端企业网站建设
  • 织梦如何做英文网站搜索引擎营销推广
  • flv网站建设seo的优化技巧有哪些
  • b2b网站快速做百度权重企业模板建站
  • 厦门园网站忱建设百度客服人工在线咨询
  • wordpress如何弄添加框湖南优化公司
  • wordpress nextgen gallery生哥seo博客
  • 织梦做的网站后台怎么进推广软文是什么意思
  • 南京建设网站公司建网站教程