JAVA导入大量数据的Excel,如何分块读取并避免内存溢出?

当需要将大量数据导入到Java应用程序中时,经常会遇到内存不足的问题。在这种情况下,将数据分成块并一次读取一个块是一种可行的解决方案。本篇文章将介绍如何使用Java分块读取Excel数据,并导入到数据库中。

优点:

该模式并不会一次性将所有数据读入内存。

maven依赖:

maven地址参考:https://blog.csdn.net/fengyuyeguirenenen/article/details/128098090

    <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.0.0</version>
    </dependency>

java 示例代码:

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.WorkbookFactory;

public class ExcelImporter {
    public static final int BLOCK_SIZE = 1000;

    public static void main(String[] args) {
        String fileName = "data.xlsx";
        File file = new File(fileName);

        try (InputStream in = new FileInputStream(file)) {
            Workbook workbook = WorkbookFactory.create(in);
            Sheet sheet = workbook.getSheetAt(0);

            int lastRowNum = sheet.getLastRowNum();
            int totalRows = lastRowNum + 1;
            int numBlocks = (int) Math.ceil((double) totalRows / BLOCK_SIZE);

            for (int i = 0; i < numBlocks; i++) {
                int startRow = i * BLOCK_SIZE;
                int endRow = Math.min(startRow + BLOCK_SIZE - 1, lastRowNum);

                for (int j = startRow; j <= endRow; j++) {
                    Row row = sheet.getRow(j);
                    if (row != null) {
                        Cell cell1 = row.getCell(0);
                        Cell cell2 = row.getCell(1);
                        // 解析其他单元格
                        System.out.println(cell1.getStringCellValue() + ", " + cell2.getStringCellValue());
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

逻辑:

在这个示例代码中,我们使用了 Apache POI 库来读取 Excel 文件,以及使用了分块读取的方式,每次读取 BLOCK_SIZE(在这里设为1000)行数据。在读取每个块的数据时,我们遍历块中的每一行和单元格,执行相应的解析操作,并将结果输出。因此,该模式并不会一次性将所有数据读入内存。

注意事项:

在实际执行过程中,当调用 WorkbookFactory.create(in) 方法时,Apache POI 库会将 Excel 文件中的数据解析为一组对象(如 Sheet 对象、Row 对象、Cell 对象等),这些对象会占用一定的内存。然而,当我们采用分块读取的方式时,只有当前块中的数据会被读入内存并处理,而不是一次性读取所有数据。

当处理数据时,如果采用了不合适的算法或数据结构,也可能会导致一次性将所有数据读入内存。因此,在处理大量数据时,需要根据实际情况选择合适的算法和数据结构,并采取适当的措施来避免一次性将所有数据读入内存。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java导入excel大量数据出现内存溢出的问题可以通过以下几种方法来解决: 1. 分批导入:将大量数据分成多个小批次导入,每次只处理一部分数据避免一次性加载全部数据导致内存溢出。可以按照行或者列进行分批导入读取一部分数据后进行处理,然后再读取下一部分数据。 2. 内存优化:在导入数据时,可以优化内存使用,减少内存消耗。例如,使用SXSSF模式代替XSSF模式,SXSSF模式可以将Excel数据写入临时文件而不是全部加载到内存中,减少内存压力。 3. 限制每次读取数据量:可以通过设置读取数据的行数或者列数限制来减少内存使用。例如,使用Apache POI库的setReadWindow方法来限制每次读取的行数和列数。 4. 增加JVM内存:通过增加JVM的内存限制来避免内存溢出问题。可以通过调整-Xms和-Xmx参数来增加JVM的初始内存和最大内存限制。 5. 优化代码逻辑:检查和优化导入数据的代码逻辑,确保没有内存泄漏或者无用的数据加载。可以使用工具来进行代码分析,找出潜在的问题并进行优化。 6. 使用缓存机制:对于重复的数据,可以使用缓存机制来减少重复加载。可以将已经读取数据缓存起来,在需要的时候直接从缓存中获取,避免重复读取导致的内存占用过高。 7. 使用数据库存储:对于大量数据导入,可以考虑将数据存储在数据库中,而不是全部加载到内存中。可以使用数据库的批量插入操作来提高导入效率。 综上所述,解决java导入excel大量数据出现内存溢出问题可以通过分批导入、内存优化、限制每次读取数据量、增加JVM内存、优化代码逻辑、使用缓存机制以及使用数据库存储等方法来实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值