当前位置: 首页 > 知识库问答 >
问题:

阿帕奇POI工厂。创建(new File())java。lang.OutOfMemoryError

乐正瑞
2023-03-14

我试图使用apache POI 3.10将excel文件(xlsx)加载到工作簿对象中

我收到一个java。lang.OutofMemoryError

我在JVM上使用带有-Xmx2g参数的Java 8

当我运行程序时,所有4核(64位系统)和RAM(4gb)都达到了最大值

excel工作表有43列和166961行,相当于7179323个单元格

我正在使用Apache POIs WorkBookFactory.create(新文件),因为它使用的内存比使用InputFileStream少。

有人知道如何优化内存使用或以其他方式创建工作簿吗

下面是我的测试Reader类,不要判断,它很粗糙,包括调试语句:

import java.io.File;
import java.io.IOException;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

public class Reader {

    private Workbook wb;

    public Reader(File excel) {
        System.out.println("CONSTRUCTOR");
        wb = null;
        try  {
            wb = WorkbookFactory.create(excel);
        } catch (IOException e) {
            System.out.println("IO Exception");
            System.out.println(e.getMessage());
        } catch (InvalidFormatException e) {
            System.out.println("Invalid Format");
            System.out.println(e.getMessage());
        }
    }

    public boolean exists() { return (wb != null); }

    public void print() {}

    public static void main(String[] args) {
        System.out.println("START PRG");
        //File f = new File("oldfilename.xls");
        File f = new File("filename.xlsx");
        System.out.println("PATH:" + f.getAbsoluteFile());
        if (!f.exists()) {
            System.out.println("File does not exist.");
            System.exit(0);
        }
        System.out.println("FILE");
        Reader r = new Reader(f);
        System.out.println("Reader");
        r.print();
        System.out.println("PRG DONE");
    }
}

共有3个答案

白嘉石
2023-03-14

我只是个初学者,但我可以问你一些问题吗?

  • 为什么不使用XSSFWorkbook类打开XLSX文件。我的意思是,我总是用它来处理XLSX文件,这次我试着用一个文件(7 MB;这是我在电脑里能找到的最大的文件),它工作得很好

Windows 7旗舰版| 64位| Intel第二代Core i3 | Eclipse Juno | JDK 1.7.45 | Apache POI 3.9

Path file = Paths.get("XYZABC.xlsx");
    try {
        XSSFWorkbook wb = new XSSFWorkbook(Files.newInputStream(file, StandardOpenOption.READ));
    } catch (IOException e) {
        System.out.println("Some IO Error!!!!");
    }

请告诉我它是否适合你。

戚宏浚
2023-03-14

请在继续之前确认这些信息,

  1. 循环中是否有无限执行(for/while)
  2. 确保您的物理存储大小
  3. 最大化缓冲内存

注意根据我的理解,Apache POI不会消耗那么多内存。

梁昊天
2023-03-14

显然,加载24mb的文件不应该导致OOM。。。

乍一看,虽然Xmx设置为2G,但实际上系统中并没有那个么多可用内存。换句话说,操作系统和其他进程可能占用了4G物理内存超过2G!首先检查可用的物理内存。如果低于预期,请尝试关闭其他正在运行的应用程序/进程。

如果情况并非如此,而且确实还有足够的内存,如果不进行分析,就很难确定真正的原因。使用概要文件工具首先检查与内存相关的JVM状态。您可以简单地使用jconsole(正如JDK附带的那样)@有关如何激活JMX的信息,请参阅

连接后,检查与内存相关的读数,特别是在内存空间下方:

  1. 老根

监控这些空间,看看它在哪里挣扎。我假设这是一个独立的应用程序。若将其部署在服务器上(作为web或服务),您可以考虑使用“-XX:NewRatio”选项来高效地分配堆空间@请参阅此处的调整相关详细信息。

 类似资料:
  • Apache Kafka:分布式消息传递系统 Apache Storm:实时消息处理 我们如何在实时数据管道中使用这两种技术来处理事件数据? 在实时数据管道方面,我觉得两者做的工作是一样的。如何在数据管道上同时使用这两种技术?

  • 我有一个场景,我需要从pptx (source.pptx)中复制一些幻灯片,并根据幻灯片中的演示笔记将其下载为单独的pptx文件(output.pptx)。我正在使用apache poi来实现它。这是我的代码。 当我打开创建的output.pptx时,我收到以下错误:“PowerPoint发现output.pptx中的内容有问题,PowerPoint可以尝试修复演示文稿。如果您信任此演示文稿的来源

  • 我正在使用Flink从Apache Pulsar读取数据。我在pulsar中有一个分区主题,有8个分区。在本主题中,我生成了1000条消息,分布在8个分区中。我的笔记本电脑中有8个内核,因此我有8个子任务(默认情况下,并行度=#个内核)。在执行Eclipse中的代码后,我打开了Flink UI,发现一些子任务没有收到任何记录(空闲)。我希望所有8个子任务都能得到利用(我希望每个子任务都映射到我的主

  • Microsoft Powerpoint有一个按部分拆分幻灯片的功能(逻辑分组)。提取部分名称的最佳方法是什么?技术堆栈- 阿帕奇 POI - v5.2.2 爪哇岛 我已经用VBA < code > section name = active presentation实现了同样的效果。section properties . Name(current slide . section index)

  • 我们需要的是直接的API来设置和使用集群消息队列。我们最初的计划是使用Camel在集群JMS或ActiveMQ队列上进行消费/生产。Kafka如何使这项任务变得更容易?在任何一种情况下,应用程序本身都将在WebLogic服务器上运行。 消息传递将是点对点类型,其中有多个相同服务的实例在运行,但根据负载平衡策略,只有一个实例应该处理消息并发出结果。消息队列也是群集的,因此服务实例或队列实例的失败都不

  • 我创建了此代码以使用Apache POI读取excel文件的内容。我使用eclipse作为编辑器,但当我运行代码时,我的粗体行出现问题。有什么问题?excel的内容如下: