【问题标题】:Java Out of memory error for reading from and writing to an xlsx用于读取和写入 xlsx 的 Java 内存不足错误
【发布时间】:2018-08-30 17:54:11
【问题描述】:

我需要读取几个 xlsx 文件以查找特定于员工的数据,并同时创建另一个 xlsx 文件(如果我在任何文件中找到数据),文件名作为员工 ID 附加到我在其中找到数据的名称。例如。有一个emp id为1的员工,并且有几个xlsx文件,例如A,B,C ...等等;我需要在每个文件中查找与 emp id 1 相关的数据,对于我受到打击的文件,我需要创建一个名为 1_A.xlsx 的文件。

现在虽然我已经构建了逻辑并且正在使用 Apache POI API 进行读写,但我的代码在创建包含数据的第一个文件后抛出 Out Of Memory 错误。并且无法读取其余文件。 我曾尝试使用 SXSSF 而不是 XSSF,但发生了同样的 OOM。

增加堆空间不是我的选择。 请在此处提供帮助...提前致谢。

这是一段代码:

//Reader:


 Row row = null;
   List<Row> listOfRecords = new ArrayList<Row>();
        try {
            FileInputStream fis = new FileInputStream(metaDataFile);
            new InputStreamReader(fis, "ISO-8859-1");
            XSSFWorkbook wb = new XSSFWorkbook(fis);
            XSSFSheet sheet = wb.getSheetAt(0);
            Iterator<Row> rowIterator = sheet.iterator();
            while (rowIterator.hasNext()) {
                row = rowIterator.next();
                if (!isEmptyRow(row)) {
                    listOfRecords.add(row);
                }
            }
            wb.close();
            fis.close();

//Writer
LOGGER.info("in createWorkbook " );
        Workbook empWorkbook = new SXSSFWorkbook(200);
        Sheet empSheet = empWorkbook.createSheet("Itype Sheet For Emp_"
                + personnelNumber);
        int rowNum = listOfRecords.size();
        System.out.println("Creating excel");
        Cell c = null;
        for (int i = 0; i < rowNum; i++) {

            Row record = listOfRecords.get(i);
            Row empRow = empSheet.createRow(i++);
            if (!isEmptyRow(record)) {
                int colNum = record.getLastCellNum() + 1;

                for (int j = 0; j < colNum; j++) {
                    Cell newCell = empRow.createCell(j);

                    System.out.println("cellVal:"
                            + String.valueOf(record.getCell(j)));
                    newCell.setCellValue(String.valueOf(record.getCell(j)));

                }
            }
        }

从阅读器内部调用 writer 方法。

【问题讨论】:

  • 您好,欢迎来到 StackOverflow。如果您发布一些相关代码(包括堆栈跟踪)并解释您尝试过的内容,您将获得更好的响应。有关提示,请参阅 stackoverflow.com/help/how-to-ask
  • 这个话题可能会有所帮助:stackoverflow.com/questions/17627508/…
  • 好吧 - 文件有多大,有多少内存可用于堆空间?
  • 文件不是很大。平均 5mb。
  • 我发现在尝试读取多个文件时出现OOM。因为我试图遍历文件列表并一一读取它们以提取记录。请建议如何阅读多个 xlsx 文件而不会出现此错误。@Hulk

标签: java apache apache-poi xlsx


【解决方案1】:

读取多个 xlsx 文件确实是一件棘手的事情,但我终于解决了。

我不得不多次分解我的代码,才意识到 OOM 错误是由于读取 3 个文件后没有更多内存来处理其余文件的事实。 xlsx 文件是压缩的 xml 文件。因此,当我们尝试使用 XSSF 或 SXSSF API 读取它们时,它会将整个 DOM 加载到内存中,然后阻塞它。 我在这里找到了一个很好的解决方案: [https://github.com/monitorjbl/excel-streaming-reader] 希望这能帮助其他面临同样问题的人。

【讨论】:

    猜你喜欢
    • 2014-11-12
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多