大数据excel导出,内存溢出解决方案(SXSSF流用户模型)
SXSSF(流用戶模型 API)
SXSSF(包:org.apache.poi.xssf.streaming)是 XSSF 的一個 API 兼容的流擴展,當必須生成非常大的電子表格并且堆空間有限時使用。SXSSF 通過限制對滑動窗口內的行的訪問來實現其低內存占用,而 XSSF 允許訪問文檔中的所有行。不再出現在窗口中的舊行將無法訪問,因為它們被寫入磁盤。
您可以在工作簿構建時通過new SXSSFWorkbook(int windowSize)指定窗口大小,?也可以通過SXSSFSheet#setRandomAccessWindowSize(int windowSize) 為每頁設置它
當通過 createRow() 創建新行并且未刷新的記錄總數將超過指定的窗口大小時,具有最低索引值的行將被刷新并且無法再通過 getRow() 訪問。
默認窗口大小為100,由 SXSSFWorkbook.DEFAULT_WINDOW_SIZE 定義。
windowSize 為 -1 表示無限制訪問。在這種情況下,所有未被調用 flushRows() 刷新的記錄都可用于隨機訪問。
請注意,SXSSF通過調用 dispose 方法分配您必須始終明確清除的臨時文件。
SXSSFWorkbook 默認使用內聯字符串而不是共享字符串表。這是非常有效的,因為不需要將文檔內容保存在內存中,但也已知會生成與某些客戶端不兼容的文檔。啟用共享字符串后,文檔中的所有唯一字符串都必須保存在內存中。根據您的文檔內容,這可能比禁用共享字符串使用更多的資源。
請注意,根據您使用的功能,仍有一些內容可能會消耗大量內存,例如合并區域、超鏈接、評論……仍然只存儲在內存中,因此可能需要大量內存,如果廣泛使用。
在決定是否啟用共享字符串之前,請仔細檢查您的內存預算和兼容性需求。
下面的示例編寫了一個帶有 100 行窗口的工作表。當行數達到 101 時,將 rownum=0 的行刷新到磁盤并從內存中刪除,當 rownum 達到 102 時,則刷新 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();}總結
以上是生活随笔為你收集整理的大数据excel导出,内存溢出解决方案(SXSSF流用户模型)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java毕业设计校园考勤系统mybati
- 下一篇: 时间复杂度和空间复杂度 详谈