精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

porn亚洲| 久久精品小视频| 久久久欧美一区二区| 国产女女做受ⅹxx高潮| 人妻视频一区二区| 福利写真视频网站在线| 日本亚洲免费观看| 亚洲www啪成人一区二区麻豆| 国产精品老牛影院在线观看| 亚洲色图欧美另类| caoporn免费在线视频| 蜜臀av国产精品久久久久| 日韩精品中文字| 欧美黄网在线观看| 婷婷激情五月网| 国产精品一区二区中文字幕| 亚洲欧美日韩久久| 国产精品一区二区久久久| 菠萝菠萝蜜网站| 成人ssswww在线播放| 国产91高潮流白浆在线麻豆| 久青草国产97香蕉在线视频| 日韩一区二区三区不卡视频| 六十路在线观看| 老鸭窝毛片一区二区三区| 精品人伦一区二区色婷婷| 成人在线观看www| 国产片在线播放| 你懂的国产精品永久在线| 欧美一区二区啪啪| 国产a级黄色大片| 国产福利在线观看| 日本91福利区| 97人人模人人爽人人喊中文字 | 欧美性色综合网| 免费国产一区二区| 午夜精品一区二| 精品日产免费二区日产免费二区| 欧美网站在线观看| 欧美精品人人做人人爱视频| 精品国产xxx| 成人国产精品一级毛片视频| 欧美日韩五月天| 中国人体摄影一区二区三区| 国产女人18毛片18精品| 久久久久国产一区二区| 久久久久亚洲精品国产| 欧美日韩免费做爰视频| 欧亚精品一区| 欧美在线一二三四区| 在线综合视频网站| 国产精品久久久久久久龚玥菲| 9人人澡人人爽人人精品| 欧美亚洲国产成人精品| 成年人在线免费看片| 婷婷精品在线| 欧美乱妇20p| 中国丰满熟妇xxxx性| 毛片在线播放网址| 久久先锋影音av鲁色资源| 国产精品亚发布| 在线观看亚洲黄色| 欧美日本久久| 国产午夜精品全部视频在线播放| 中文字幕第22页| 正在播放日韩精品| 亚洲欧美国产高清| 免费看成人片| 久久99久久| 国产成人午夜精品5599| 国产精品91在线| 精品一级少妇久久久久久久| 精品国产网站| 日韩中文字幕视频| 爱爱免费小视频| 天堂av一区| 欧美日韩综合在线免费观看| 色综合天天色综合| 91麻豆精品国产综合久久久| 日韩欧美亚洲综合| 热久久精品免费视频| 国产又色又爽又黄刺激在线视频| 一区二区久久久久久| 欧美美乳视频网站在线观看| 成人免费在线电影| 亚洲人吸女人奶水| 久久av综合网| 久久99久久99精品免观看软件| 亚洲高清视频的网址| 国产日本欧美在线| xxxxx日韩| 亚洲精品视频在线观看免费| 波多野结衣综合网| 影音先锋在线视频| 一区精品在线播放| 日韩精品久久久免费观看| 色婷婷激情五月| 国产精品一色哟哟哟| 国产日韩av在线播放| 销魂美女一区二区| 国产麻豆9l精品三级站| 久久精品aaaaaa毛片| 免费国产黄色片| 成人美女视频在线观看18| 亚洲va欧美va在线观看| 亚洲一区二区视频在线播放| 久久婷婷丁香| 国产成人精品日本亚洲| 国产精品久久影视| 精品一区二区精品| 成人h片在线播放免费网站| 国产一级免费视频| 国产一区999| 成人精品网站在线观看| 天堂网av在线播放| 亚洲欧洲色图综合| 青青视频在线播放| 欧美男男tv网站在线播放| 亚洲国产成人av网| 国产又大又黄又粗又爽| 久久超级碰碰| 日韩精品一区二区三区第95| 91高清免费观看| 午夜欧美精品| 国产精品入口免费视频一| 五月天激情婷婷| 久久亚洲欧美国产精品乐播| 亚洲精品少妇一区二区| 久久精品资源| 欧美一级一级性生活免费录像| 香蕉视频黄色在线观看| 韩国亚洲精品| 国产91av在线| 欧美一区二区三区激情| 亚洲色欲色欲www| 手机视频在线观看| 精品国产精品国产偷麻豆| 17婷婷久久www| 国产精品尤物视频| 久久午夜国产精品| 两根大肉大捧一进一出好爽视频| julia中文字幕一区二区99在线| 亚洲国产精品成人精品| 国产人妻一区二区| 久久精品国产亚洲夜色av网站| 久久精品欧美视频| 伊人久久国产精品| 国产精品1024| 欧美与动交zoz0z| 成人噜噜噜噜| 亚洲黄在线观看| 国产一区二区三区四区五区六区| 国产韩日影视精品| 国模精品系列视频| 日本久久一级片| 精品国产鲁一鲁一区二区张丽| 男人插女人下面免费视频| 精品久久久久久久久久岛国gif| 日韩av最新在线观看| 成年人看的免费视频| 午夜久久福利| 国产精品国产三级欧美二区| 懂色一区二区三区| 欧美性猛片aaaaaaa做受| 欧洲美熟女乱又伦| 精品在线播放免费| 美女三级99| 性欧美hd调教| 精品免费日韩av| 日韩成年人视频| 国内精品自线一区二区三区视频| 中文字幕精品一区日韩| 少妇高潮一区二区三区99| 精品国产一区久久| 日韩av网站在线播放| 欧美一级网站| 国产精品一码二码三码在线| 啊啊啊久久久| 亚洲精品自拍视频| 久久国产波多野结衣| 国产精品中文欧美| 国产一区二区网| 大色综合视频网站在线播放| 亚洲精品欧美日韩| 欧美激情20| www.国产精品一二区| 性猛交xxxx乱大交孕妇印度| 中文字幕在线一区免费| 日韩欧美xxxx| 任我爽精品视频在线播放| 国产成人aa精品一区在线播放 | 午夜久久av| 日本久久91av| 欧美熟妇另类久久久久久不卡 | 萌白酱国产一区二区| 久久久久久无码精品大片| 亚洲丝袜制服诱惑| 黄色a一级视频| 国产在线一区观看| www黄色av| 欧美日韩a区| 婷婷亚洲婷婷综合色香五月| 日本在线影院| 久久精品中文字幕| 婷婷国产在线| 狠狠久久亚洲欧美专区| 精品人妻一区二区免费| 日韩精品一卡二卡三卡四卡无卡| 蜜桃传媒视频麻豆一区| 99视频这里有精品| 热久久免费国产视频| 四虎在线免费看| 91精品在线观看入口| 青青操在线视频观看| 蜜桃视频在线观看一区二区| 国产精品无码免费专区午夜| 欧美中文字幕一区二区| 好吊妞www.84com只有这里才有精品| 欧美巨大xxxx做受沙滩| 欧美r级在线观看| 最近中文字幕在线免费观看| 国产精品久久久久久久久久免费看| 亚洲高清无码久久| 亚洲在线观看| 久久久久久av无码免费网站下载| 成人精品视频| 欧美日韩一区二区三区在线视频 | 精品播放一区二区| 国产精品丝袜黑色高跟鞋| 在线观看不卡视频| www.国产色| 欧美激情一区二区三区四区| 久久久久久久高清| 欧美日韩综合| 91香蕉视频网址| 第一会所sis001亚洲| 久久综合一区| 色综合www| 麻豆蜜桃91| 杨幂一区二区三区免费看视频| 国产精品久久一| 成人视屏在线观看| 日韩av免费在线看| 欧美精品总汇| 国产男女猛烈无遮挡91| 日韩毛片一区| 欧美激情影音先锋| 欧美成人综合在线| 亚洲美女av黄| 国产中文字幕在线看| 亚洲欧美日韩国产成人| 免费在线稳定资源站| 亚洲色图35p| 国产欧美第一页| 欧美日韩久久久久久| 日本少妇在线观看| 亚洲国产日韩a在线播放| 久久综合久久鬼| 亚洲不卡一区二区三区| 国产污污视频在线观看| 色综合久久综合网97色综合| 欧美视频www| 久久蜜桃av一区二区天堂| 日韩网站在线播放| 久久久久成人黄色影片| 中文字幕亚洲日本| 免费精品99久久国产综合精品| 国产精品久久a| 国内精品久久久久影院色| www日本在线观看| 日本人妖一区二区| 爱爱爱爱免费视频| 亚洲欧美日韩国产| 中文字幕国内自拍| 国产精品一区二区三区99| 中国特级黄色大片| 久久亚洲春色中文字幕久久久| 免费看的黄色录像| 一区二区三区精品| 中文字幕在线观看视频网站| 欧美图区在线视频| 亚洲免费国产视频| 在线播放中文字幕一区| 成人av手机在线| 亚洲欧美日韩爽爽影院| 蜜芽在线免费观看| 中文字幕亚洲欧美| 麻豆国产在线播放| 久久成人精品一区二区三区| 福利影院在线看| 国产精品自产拍高潮在线观看| 中文字幕日韩在线| 91成人在线看| 国产精品久久久久久久久久辛辛 | 天天操天天操天天操| 在线精品91av| 久久国产精品高清一区二区三区| 久久韩国免费视频| 毛片在线网站| 亚洲va国产va天堂va久久| 色婷婷综合久久久久久| 免费在线精品视频| 日韩精品一区二区三区免费观影| 女人一区二区三区| 婷婷综合网站| 日韩中文字幕组| 成人免费毛片a| 午夜剧场免费在线观看| 91久久精品一区二区三区| 免费的毛片视频| 精品播放一区二区| 老司机午夜在线视频| 欧美美女15p| 免费在线中文字幕| 国产精品日韩欧美大师| 日韩高清影视在线观看| 国产乱子伦精品视频| 美日韩一区二区三区| 爱爱的免费视频| 亚洲一区欧美一区| 日本免费观看视| 欧美性猛交xxxxx水多| 国产av无码专区亚洲av| 精品国产91亚洲一区二区三区婷婷| av成人手机在线| 久久天天躁狠狠躁夜夜躁| 丝袜美腿一区| 久久精品国产99精品国产亚洲性色| 综合激情网站| 成人免费在线网| 国产成人免费在线视频| www.av免费| 在线观看中文字幕不卡| 欧美少妇另类| 欧美在线一级视频| 欧美电影完整版在线观看| 男的插女的下面视频| 美女黄网久久| 野外性满足hd| 欧美日韩另类在线| 无码国产精品一区二区色情男同 | 欧美magnet| 欧美日韩在线一区二区三区| 亚洲欧美不卡| 欧美成人国产精品一区二区| 欧美色另类天堂2015| 视频二区在线| 日韩av男人的天堂| 欧美一区二区三区激情视频| 欧美伦理片在线观看| 国产婷婷精品av在线| 黄色香蕉视频在线观看| 91精品国产一区二区| 18视频在线观看| 97视频中文字幕| 99热这里只有成人精品国产| 国产wwwxx| 国产精品久久国产精麻豆99网站| 中文有码在线播放| 久久视频免费在线播放| 秋霞影院一区| 国产3p露脸普通话对白| 96av麻豆蜜桃一区二区| 91久久国产综合| 日韩欧美一二三四区| 成人好色电影| 91精品国产综合久久香蕉最新版 | 亚洲免费专区| 污污的网站18| 亚洲天堂福利av| 黑人精品一区二区三区| 欧美重口另类videos人妖| 国产精品亚洲片在线播放| 久久99久久久久久| 97精品国产97久久久久久久久久久久| 男人天堂2024| 精品国产拍在线观看| 视频一区中文字幕精品| 日韩欧美精品在线观看视频| 国产精品乱人伦| 99re这里只有精品在线| 色噜噜狠狠狠综合曰曰曰| 欧美香蕉视频| 在线成人av电影| 国产成a人亚洲| 欧美一区免费看| 欧美精品情趣视频| 亚洲激情播播| 黄色三级视频在线播放| 欧美日韩色婷婷| 国产精品扒开做爽爽爽的视频 | 丰满人妻一区二区三区免费| 日韩av免费看网站| 欧美视频四区| 秋霞网一区二区三区| 色悠久久久久综合欧美99| 麻豆网站视频在线观看| 精品视频导航| 国产乱人伦偷精品视频不卡| 国产精品va无码一区二区三区|