精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

快手二面:敢不敢說說為啥POI會導致內存溢出?

開發 開發工具
在POI中,提供了SXSSFWorkbook,通過將部分數據寫入磁盤上的臨時文件來減少內存占用。但是SXSSFWorkbook只能用于文件寫入,但是文件讀取還是不行的,就像我們前面分析過的,Excel的文件讀取還是會存在內存溢出的問題的。?

Apache POI,是一個非常流行的文檔處理工具,通常大家會選擇用它來處理Excel文件。但是在實際使用的時候,經常會遇到內存溢出的情況,那么,為啥他會導致內存溢出呢?

Excel并沒看到的那么小

我們通常見到的xlsx文件,其實是一個個壓縮文件。它們把若干個XML格式的純文本文件壓縮在一起,Excel就是讀取這些壓縮文件的信息,最后展現出一個完全圖形化的電子表格。

所以,如果我們把xlsx文件的后綴更改為.zip或.rar,再進行解壓縮,就能提取出構成Excel的核心源碼文件。解壓后會發現解壓后的文件中有3個文件夾和1個XML格式文件:

圖片圖片

_rels 文件夾 看里面數據像是一些基礎的配置信息,比如 workbook 文件的位置等信息,一般不會去動它. 

docProps 文件夾下重要的文件是一個 app.xml,這里面主要存放了 sheet 的信息,如果想添加或編輯 sheet 需要改這個文件.其他文件都是一些基礎信息的數據,比如文件所有者,創建時間等.

 xl 文件夾是最重要的一個文件夾,里面存放了 Sheet 中的數據,行和列的格式,單元格的格式,sheet 的配置信息等等信息.

所以,實際上我們處理的xlsx文件實際上是一個經過高度壓縮的文件格式,背后是有好多文件支持的。所以,我們看到的一個文件可能只有2M,但是實際上這個文件未壓縮情況下可能要比這大得多。

圖片圖片

也就是說,POI在處理的時候,處理的實際上并不只是我們看到的文件大小,實際上他的大小大好幾倍。(本文節選自我的《java面試寶典》)

這是為什么明明我們處理的文件只有100多兆,但是實際卻可能占用1G內存的其中一個原因。當然這只是其中一個原因,還有一個原因,我們就需要深入到POI的源碼中來看了。

POI溢出原理

我們拿POI的文件讀取來舉例,一般來說文件讀取出現內存溢出的情況更多一些。以下是一個POI文件導出的代碼示例:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;


public class ExcelReadTest {


    public static void main(String[] args) {
        // 指定要讀取的文件路徑
        String filename = "example.xlsx";


        try (FileInputStream fileInputStream = new FileInputStream(new File(filename))) {
            // 創建工作簿對象
            Workbook workbook = new XSSFWorkbook(fileInputStream);


            // 獲取第一個工作表
            Sheet sheet = workbook.getSheetAt(0);


            // 遍歷所有行
            for (Row row : sheet) {
                // 遍歷所有單元格
                for (Cell cell : row) {                   
                    // 根據不同數據類型處理數據
                    switch (cell.getCellType()) {
                        case STRING:
                            System.out.print(cell.getStringCellValue() + "\t");
                            break;
                        case NUMERIC:
                            if (DateUtil.isCellDateFormatted(cell)) {
                                System.out.print(cell.getDateCellValue() + "\t");
                            } else {
                                System.out.print(cell.getNumericCellValue() + "\t");
                            }
                            break;
                        case BOOLEAN:
                            System.out.print(cell.getBooleanCellValue() + "\t");
                            break;
                        case FORMULA:
                            System.out.print(cell.getCellFormula() + "\t");
                            break;
                        default:
                            System.out.print(" ");
                    }
                }
                System.out.println();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }


}

這里面用到了一個關鍵的XSSFWorkbook類:

public XSSFWorkbook(InputStream is) throws IOException {
    this(PackageHelper.open(is));
}


public static OPCPackage open(InputStream is) throws IOException {
    try {
        return OPCPackage.open(is);
    } catch (InvalidFormatException e){
        throw new POIXMLException(e);
    }
}

最終會調用到OPCPackage.open方法,看看這個方法是咋實現的:

/**
 * Open a package.
 *
 * Note - uses quite a bit more memory than {@link #open(String)}, which
 * doesn't need to hold the whole zip file in memory, and can take advantage
 * of native methods
 *
 * @param in
 *            The InputStream to read the package from
 * @return A PackageBase object
 *
 * @throws InvalidFormatException
 *         Throws if the specified file exist and is not valid.
 * @throws IOException If reading the stream fails
 */
public static OPCPackage open(InputStream in) throws InvalidFormatException,
        IOException {
    OPCPackage pack = new ZipPackage(in, PackageAccess.READ_WRITE);
    try {
        if (pack.partList == null) {
            pack.getParts();
        }
    } catch (InvalidFormatException | RuntimeException e) {
        IOUtils.closeQuietly(pack);
        throw e;
    }
    return pack;
}

這行代碼的注釋中說了:這個方法會把整個壓縮文件都加載到內存中。也就是把整個 Excel 文檔加載到內存中,可想而知,這在處理大型文件時是肯定會導致導致內存溢出的。(本文節選自我的《java面試寶典》,里面有800多道面試常考題目)

也就是說我們使用的XSSFWorkbook(包括HSSFWorkbook也同理)在處理Excel的過程中會將整個Excel都加載到內存中,在文件比較大的時候就會導致內存溢出。

如何解決溢出問題?

在POI中,提供了SXSSFWorkbook,通過將部分數據寫入磁盤上的臨時文件來減少內存占用。但是SXSSFWorkbook只能用于文件寫入,但是文件讀取還是不行的,就像我們前面分析過的,Excel的文件讀取還是會存在內存溢出的問題的。

那如果要解決這個問題,可以考慮使用EasyExcel!(本文節選自我的《java面試寶典》,里面有800多道面試常考題目)

關于使用XSSFWorkbook和EasyExcel的文件讀取,我這里也做了個內存占用的對比,讀取一個27.3?MB的文件:

package excel.read;


import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;


public class XSSFExcelReadTest {


    public static void main(String[] args) {
        // 指定要讀取的文件路徑
        String filename = "example.xlsx";


        try (FileInputStream fileInputStream = new FileInputStream(new File(filename))) {
            // 創建工作簿對象
            Workbook workbook = new XSSFWorkbook(fileInputStream);


            // 獲取第一個工作表
            Sheet sheet = workbook.getSheetAt(0);


            // 遍歷所有行
            for (Row row : sheet) {
                // 遍歷所有單元格
                for (Cell cell : row) {
                    // 根據不同數據類型處理數據
                    switch (cell.getCellType()) {
                        case STRING:
                            System.out.print(cell.getStringCellValue() + "\t");
                            break;
                        case NUMERIC:
                            if (DateUtil.isCellDateFormatted(cell)) {
                                System.out.print(cell.getDateCellValue() + "\t");
                            } else {
                                System.out.print(cell.getNumericCellValue() + "\t");
                            }
                            break;
                        case BOOLEAN:
                            System.out.print(cell.getBooleanCellValue() + "\t");
                            break;
                        case FORMULA:
                            System.out.print(cell.getCellFormula() + "\t");
                            break;
                        default:
                            System.out.print(" ");
                    }
                }
                System.out.println();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } 
    }


}

使用Arthas查看內存占用情況:

圖片圖片

占用內存在1000+M。

改成使用EasyExcel同樣讀取同一份文件:

package excel.read;


import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;


public class EasyExcelReadTest {


    public static void main(String[] args) {
        // 指定要讀取的文件路徑
        String filename = "example.xlsx";


        EasyExcel.read(filename, new PrintDataListener()).sheet().doRead();
    }


}


// 監聽器,用于處理讀取到的數據
class PrintDataListener implements ReadListener<Object> {
    @Override
    public void invoke(Object data, AnalysisContext context) {
        // 處理每一行的數據
        System.out.println(data);
    }


    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 所有數據解析完成后的操作
    }


    @Override
    public void onException(Exception exception, AnalysisContext context) throws Exception {
        // 處理讀取過程中的異常
    }
}

同樣使用Arthas查看內存占用情況:

圖片圖片

內存占用只有不到100M。

責任編輯:武曉燕 來源: Hollis
相關推薦

2014-01-23 16:53:49

2018-10-08 10:18:13

2015-02-09 17:38:56

愛情保鮮期平安WiFi

2009-05-04 09:26:39

2010-11-10 12:38:50

10G網絡以太網

2021-02-28 20:52:41

5G自動駕駛數據

2022-10-28 12:18:18

AI繪畫自拍

2013-03-28 13:33:39

魅族MEIZU招聘

2020-12-27 10:44:55

微信支付寶互聯網應用

2020-12-28 06:20:04

微信支付寶移動應用

2022-10-18 08:38:16

內存泄漏線程

2024-10-28 11:07:33

磁盤目錄文件

2025-10-11 09:30:52

2020-01-17 20:00:25

SQL函數數據庫

2019-10-10 09:34:19

Python網絡爬蟲GitHub

2024-05-24 10:15:36

2025-07-14 01:55:00

2024-10-24 16:51:08

2024-03-25 12:38:00

MySQL內存參數

2021-08-26 05:00:44

生產環境內存
點贊
收藏

51CTO技術棧公眾號

91theporn国产在线观看| 黄色短视频在线观看| 亚洲区欧洲区| 99国产欧美另类久久久精品| 国产激情久久久| 永久免费看mv网站入口| 欧美激情极品| 欧美日韩国产综合一区二区三区| 青青青在线观看视频| 女人天堂在线| 国产一区二区成人久久免费影院| 高清欧美性猛交| 日本黄色激情视频| 精品亚洲精品| 制服丝袜一区二区三区| 我的公把我弄高潮了视频| h视频网站在线观看| 风流少妇一区二区| 国产精品自拍偷拍| aaa人片在线| 综合激情网站| 尤物99国产成人精品视频| 国产大尺度视频| 欧美综合影院| 日本黄色一区二区| 男人插女人视频在线观看| 免费观看在线黄色网| 91蜜桃网址入口| 91成人免费观看| 中文字幕视频一区二区| 亚洲三级观看| 欧美日本黄视频| 99热99这里只有精品| 偷拍一区二区| 亚洲国产91色在线| 超级砰砰砰97免费观看最新一期| 成人自拍视频网| 亚洲sss视频在线视频| 超级碰在线观看| 日本中文字幕在线看| 国产亚洲欧美色| 欧美1o一11sex性hdhd| 欧美熟妇交换久久久久久分类| 精品综合免费视频观看| 国产精品亚发布| www.久久视频| 日韩成人午夜精品| 国产精品激情av在线播放| 中文字幕国产在线观看| 国产精品久久国产愉拍| 97免费中文视频在线观看| 久久亚洲av午夜福利精品一区| 亚洲综合色网| 久久久国产精品视频| 99精品中文字幕| 日韩免费特黄一二三区| 自拍偷拍免费精品| 女同久久另类69精品国产| 99久久99热这里只有精品 | 欧美影院在线播放| 久久黄色精品视频| 国产美女精品| 日韩av不卡电影| 小泽玛利亚一区二区三区视频| 日韩 欧美一区二区三区| 国产精品一区二区三| 夜夜嗨aⅴ一区二区三区| 久久99精品国产.久久久久久| 国产在线精品播放| 国产乱淫av片免费| 国产精品99久久久久久有的能看 | 国产精品一区二区人人爽| 国产在线视频精品一区| 99re资源| 日韩亚洲视频在线观看| 亚洲国产电影在线观看| 伊人天天久久大香线蕉av色| 中文字幕中文字幕在线中高清免费版| 亚洲精品高清视频在线观看| 国产精品久久中文字幕| 欧美日韩精品免费观看视完整| 在线看日韩精品电影| 午夜免费看毛片| **爰片久久毛片| 日韩经典第一页| 69xxx免费| 国产精品mm| 人九九综合九九宗合| 91成人国产综合久久精品| 高清在线观看日韩| 日韩av在线电影观看| av文字幕在线观看| 欧美日韩在线视频一区| 九色porny自拍| 成人动态视频| 在线亚洲欧美视频| 久久网中文字幕| 蜜臀久久久99精品久久久久久| 97视频中文字幕| 邻家有女韩剧在线观看国语| 亚洲卡通动漫在线| 欧美牲交a欧美牲交| 祥仔av免费一区二区三区四区| 91视频综合| www高清在线视频日韩欧美| 国产亚洲欧美久久久久| 免费观看日韩电影| 国模一区二区三区私拍视频| 免费大片黄在线| 黄网动漫久久久| 欧美成人手机在线视频| 老司机成人在线| 伦理中文字幕亚洲| 樱花视频在线免费观看| 豆国产96在线|亚洲| 视频三区二区一区| 91九色国产在线播放| 欧美日韩亚洲综合一区| 国产在线观看无码免费视频| 欧美成人综合| 国产区精品视频| 蜜芽tv福利在线视频| 亚洲综合激情网| 国产成人在线综合| 国产中文精品久高清在线不| 国外成人在线直播| 亚洲AV无码乱码国产精品牛牛 | 日韩不卡在线观看日韩不卡视频| 91在线播放视频| 午夜伦全在线观看| 91黄色免费观看| 欧美激情aaa| 99热免费精品在线观看| 99蜜桃在线观看免费视频网站| 二区三区在线| 91国产免费观看| 国产激情在线免费观看| 亚洲最黄网站| 九色91在线视频| 高清毛片在线观看| 亚洲二区在线播放视频| 国产一级一级片| 国产很黄免费观看久久| 成人av在线播放观看| 国模大尺度视频一区二区| 中文精品99久久国产香蕉| 青青视频在线免费观看| 久久久一区二区三区捆绑**| 亚洲熟妇av一区二区三区漫画| 国产精品毛片久久久| 国内外成人免费激情在线视频网站 | 中文字幕免费精品| 亚洲a∨日韩av高清在线观看| 蜜桃视频在线观看免费视频网站www| 欧美性猛片aaaaaaa做受| www..com.cn蕾丝视频在线观看免费版 | 97se狠狠狠综合亚洲狠狠| 日本熟妇人妻xxxx| 欧美日韩看看2015永久免费| 69国产精品成人在线播放| 午夜影院在线视频| 一本高清dvd不卡在线观看| 99久久人妻无码精品系列| 久久精品在线| 亚洲欧洲国产精品久久| 国产精品一区三区在线观看| 欧美高清在线播放| 天堂在线视频观看| 在线观看网站黄不卡| 日韩av片在线免费观看| 国产麻豆视频精品| 男女超爽视频免费播放| 国产一区99| 91亚洲国产成人精品性色| 男男gaygays亚洲| 亚洲欧美日本另类| 一级黄色大片网站| 亚洲国产精品久久艾草纯爱| 成都免费高清电影| 国产中文一区二区三区| 亚洲国产精品成人天堂| 国产精品免费大片| 成人免费午夜电影| 久久青草伊人| 日韩一二三在线视频播| 亚洲精品国偷拍自产在线观看蜜桃| 精品久久久久久久大神国产| 国产精成人品免费观看| 国产精品资源网站| 国产精品亚洲αv天堂无码| 久久香蕉国产| 国产亚洲精品久久飘花| 嫩草伊人久久精品少妇av杨幂| 欧美成人免费网| 男人天堂资源在线| 日韩美女主播在线视频一区二区三区| 中文字字幕在线中文| 最新中文字幕一区二区三区| 女尊高h男高潮呻吟| 经典一区二区三区| 人妻少妇被粗大爽9797pw| 亚洲欧洲中文字幕| 欧美日韩精品免费观看| 日韩精品一区二区三区中文在线| 日韩69视频在线观看| 美洲精品一卡2卡三卡4卡四卡| 亚洲人成电影网站色…| 亚洲第一成年人网站| 欧美在线你懂的| 日韩精品在线免费看| 中文字幕在线不卡| 在线不卡av电影| 成人黄色在线看| 天天综合成人网| 日精品一区二区三区| 国产一区二区视频播放| 伊人久久大香线蕉综合四虎小说| 欧美一区二视频在线免费观看| 成人精品动漫一区二区三区| 91在线观看免费| 精品国产欧美日韩一区二区三区| 91高潮精品免费porn| 日本动漫理论片在线观看网站| 尤物九九久久国产精品的分类| 天天操天天干天天舔| 日韩欧美的一区二区| 国产又粗又猛又爽| 精品视频一区三区九区| 无码人妻精品一区二区三区蜜桃91| 亚洲一区二区在线播放相泽| 欧美第一页在线观看| 国产精品久久久久久福利一牛影视 | 成人午夜免费电影| 久久出品必属精品| 久久精品国产免费| 高清一区二区视频| 日韩激情中文字幕| 茄子视频成人免费观看| 国产亚洲毛片| 久久久999视频| 99精品免费| 免费观看美女裸体网站| 在线精品观看| 久久久久久久久久久视频| 中文高清一区| av天堂永久资源网| 久久一区视频| 亚洲视频在线观看一区二区三区| 米奇777在线欧美播放| 成年人免费在线播放| 日韩精品电影在线观看| 天堂av在线网站| 麻豆精品一二三| 亚洲一区二区三区四区精品| 国产精品自在欧美一区| 黑人无套内谢中国美女| 成人一区在线观看| 免费看黄色aaaaaa 片| 久久久久国产精品人| 日本性高潮视频| 国产精品的网站| 欧洲第一无人区观看| 亚洲小说欧美激情另类| 日韩免费不卡视频| 日韩欧美中文第一页| 国产九色91回来了| 91精品婷婷国产综合久久竹菊| 精品二区在线观看| 亚洲激情视频网站| 粉嫩av一区| 操日韩av在线电影| 国产黄大片在线观看| 日韩av不卡在线| 亚洲欧美一级| 国产日韩欧美一区二区| 精品国产精品国产偷麻豆| 伊人天天久久大香线蕉av色| 国内激情久久| 91香蕉视频污版| 国产一区二区三区在线观看精品| 中国特级黄色大片| 久久九九影视网| 91在线播放观看| 狠狠操狠狠色综合网| 在线免费观看av片| 亚洲成人av片在线观看| 国产区视频在线| 欧美激情视频给我| 国产亚洲一区二区手机在线观看 | 精品日韩免费| 日本精品福利视频| 久久一本综合频道| 色哟哟网站在线观看| 欧美激情在线一区二区| 国产一级特黄a高潮片| 欧美视频中文一区二区三区在线观看| 国产黄色av网站| 亚洲一品av免费观看| 黄页网站在线| 国产日韩欧美91| 日韩动漫一区| 国产 国语对白 露脸| 水野朝阳av一区二区三区| 中文字幕制服丝袜| 国产精品美女久久久久aⅴ| 日韩三级小视频| 91精品免费在线观看| 国产在线中文字幕| 国外色69视频在线观看| 欧美1区2区3| 伊人久久大香线蕉精品| 天堂成人免费av电影一区| 稀缺小u女呦精品呦| 亚洲视频中文字幕| 亚洲 小说区 图片区| 亚洲黄色www网站| 特级毛片在线| 成人黄色av网站| 欧美日韩高清| 97xxxxx| 99久久久久久| 久久综合亚洲色hezyo国产| 69堂国产成人免费视频| 国产中文在线| 日韩免费在线免费观看| 久久夜色电影| 又大又硬又爽免费视频| 国产一区91精品张津瑜| www.97视频| 在线不卡免费欧美| eeuss影院www在线播放| 国产999精品| 亚洲天堂日韩在线| 黄色免费观看视频网站| 99re在线视频这里只有精品| 国产亚洲成人av| 精品欧美一区二区三区精品久久 | 国产一区2区| 精品免费国产一区二区| 91色九色蝌蚪| 97超碰人人干| 日韩高清欧美高清| а√天堂8资源中文在线| 国产精品v欧美精品v日韩| 欧美精品三区| 2018国产精品| 亚洲国产婷婷综合在线精品| www.99视频| 久久免费福利视频| 麻豆一区二区| 欧美成人一区二区在线观看| 91社区在线播放| 激情五月婷婷网| 在线观看国产精品91| 国外成人福利视频| 亚洲制服欧美久久| 激情丁香综合五月| 欧美成人777| 日韩一区二区三区高清免费看看| 伊人精品影院| 国偷自产av一区二区三区小尤奈| 99国产精品私拍| 无码 人妻 在线 视频| 欧美午夜精品一区| 麻豆视频网站在线观看| 亚洲综合中文字幕在线| 91久久夜色精品国产九色| 欧美bbbbb性bbbbb视频| 欧洲av一区二区嗯嗯嗯啊| 免费a级人成a大片在线观看| 97国产超碰| 欧美亚洲视频| 免费成人深夜蜜桃视频| 日韩欧美中文字幕公布| 麻豆成全视频免费观看在线看| 日韩av高清| 国产原创一区二区| 日韩精品久久久久久久酒店| 亚洲午夜激情免费视频| 国产高清精品二区| 黄色免费视频大全| 亚洲欧洲av色图| 天天操天天射天天舔| 国产精品老女人视频| 欧美日韩mv| 久久成人激情视频| 欧美一区二区三区播放老司机| 国产va在线视频| 亚洲永久激情精品| 99精品在线免费| 国产又大又粗又长| 5278欧美一区二区三区| 91久久国产| 日韩 中文字幕| 欧美一区日本一区韩国一区| 原纱央莉成人av片| 日本一二三区视频在线| 国产色婷婷亚洲99精品小说| 亚洲欧美激情在线观看| 91精品国产综合久久香蕉922|