日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

大数据excel导出,内存溢出解决方案(SXSSF流用户模型)

發(fā)布時(shí)間:2024/3/24 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大数据excel导出,内存溢出解决方案(SXSSF流用户模型) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

SXSSF(流用戶模型 API)

SXSSF(包:org.apache.poi.xssf.streaming)是 XSSF 的一個(gè) API 兼容的流擴(kuò)展,當(dāng)必須生成非常大的電子表格并且堆空間有限時(shí)使用。SXSSF 通過(guò)限制對(duì)滑動(dòng)窗口內(nèi)的行的訪問(wèn)來(lái)實(shí)現(xiàn)其低內(nèi)存占用,而 XSSF 允許訪問(wèn)文檔中的所有行。不再出現(xiàn)在窗口中的舊行將無(wú)法訪問(wèn),因?yàn)樗鼈儽粚?xiě)入磁盤(pán)。

您可以在工作簿構(gòu)建時(shí)通過(guò)new SXSSFWorkbook(int windowSize)指定窗口大小,?也可以通過(guò)SXSSFSheet#setRandomAccessWindowSize(int windowSize) 為每頁(yè)設(shè)置它

當(dāng)通過(guò) createRow() 創(chuàng)建新行并且未刷新的記錄總數(shù)將超過(guò)指定的窗口大小時(shí),具有最低索引值的行將被刷新并且無(wú)法再通過(guò) getRow() 訪問(wèn)。

默認(rèn)窗口大小為100,由 SXSSFWorkbook.DEFAULT_WINDOW_SIZE 定義。

windowSize 為 -1 表示無(wú)限制訪問(wèn)。在這種情況下,所有未被調(diào)用 flushRows() 刷新的記錄都可用于隨機(jī)訪問(wèn)。

請(qǐng)注意,SXSSF通過(guò)調(diào)用 dispose 方法分配您必須始終明確清除的臨時(shí)文件。

SXSSFWorkbook 默認(rèn)使用內(nèi)聯(lián)字符串而不是共享字符串表。這是非常有效的,因?yàn)椴恍枰獙⑽臋n內(nèi)容保存在內(nèi)存中,但也已知會(huì)生成與某些客戶端不兼容的文檔。啟用共享字符串后,文檔中的所有唯一字符串都必須保存在內(nèi)存中。根據(jù)您的文檔內(nèi)容,這可能比禁用共享字符串使用更多的資源。

請(qǐng)注意,根據(jù)您使用的功能,仍有一些內(nèi)容可能會(huì)消耗大量?jī)?nèi)存,例如合并區(qū)域、超鏈接、評(píng)論……仍然只存儲(chǔ)在內(nèi)存中,因此可能需要大量?jī)?nèi)存,如果廣泛使用。

在決定是否啟用共享字符串之前,請(qǐng)仔細(xì)檢查您的內(nèi)存預(yù)算和兼容性需求。

下面的示例編寫(xiě)了一個(gè)帶有 100 行窗口的工作表。當(dāng)行數(shù)達(dá)到 101 時(shí),將 rownum=0 的行刷新到磁盤(pán)并從內(nèi)存中刪除,當(dāng) rownum 達(dá)到 102 時(shí),則刷新 rownum=1 的行,以此類推。

?

mport junit.framework.Assert; mport org.apache.poi.ss.usermodel.Cell; mport org.apache.poi.ss.usermodel.Row; mport org.apache.poi.ss.usermodel.Sheet; mport org.apache.poi.ss.usermodel.Workbook; mport org.apache.poi.ss.util.CellReference; mport org.apache.poi.xssf.streaming.SXSSFWorkbook;public static void main(String[] args) throws Throwable {SXSSFWorkbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory, exceeding rows will be flushed to diskSheet sh = wb.createSheet();for(int rownum = 0; rownum < 1000; rownum++){Row row = sh.createRow(rownum);for(int cellnum = 0; cellnum < 10; cellnum++){Cell cell = row.createCell(cellnum);String address = new CellReference(cell).formatAsString();cell.setCellValue(address);}}// Rows with rownum < 900 are flushed and not accessiblefor(int rownum = 0; rownum < 900; rownum++){Assert.assertNull(sh.getRow(rownum));}// ther last 100 rows are still in memoryfor(int rownum = 900; rownum < 1000; rownum++){Assert.assertNotNull(sh.getRow(rownum));}FileOutputStream out = new FileOutputStream("/temp/sxssf.xlsx");wb.write(out);out.close();// dispose of temporary files backing this workbook on diskwb.dispose();}

總結(jié)

以上是生活随笔為你收集整理的大数据excel导出,内存溢出解决方案(SXSSF流用户模型)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。