Tried to allocate an array of length 118,120,841, but the maximum length for this record type is 100

完整错误:
Tried to allocate an array of length 118,120,841, but the maximum length for this record type is 100,000,000. If the file is not corrupt and not large, please open an issue on bugzilla to request increasing the maximum allowable size for this record type. You can set a higher override value with IOUtils.setByteArrayMaxOverride()

问题:
这是一个内存分配问题,具体来说,它涉及到 Apache POI 在处理 Excel 文件时,尝试分配超过最大限制的内存数组。通常这种问题出现在处理大文件时,特别是当 Excel 文件非常大的时候 ,我遇到这个错误是因为上传了一个有50万数据的excel

解决:
1.分批处理数据:如果你处理的数据量非常大,可以考虑将文件分批处理,避免一次性加载整个文件。你可以在读取 Excel 文件时按行处理数据,而不是一次性将所有行加载到内存中。这样就可以避免内存溢出。
使用 Streaming API(SXSSFWorkbook)来读取大文件,SXSSFWorkbook 只会将一小部分数据加载到内存中,从而避免内存溢出问题。

Workbook wb = new SXSSFWorkbook(new XSSFWorkbook(file.getInputStream()), 100);  // 100 表示缓存100行数据
//其他逻辑
// 清理缓存的内存数据,这一步必做
((SXSSFWorkbook) wb).dispose();

用上边那一行替换下边的写法:

Workbook wb = new XSSFWorkbook(file.getInputStream());  

2.设置内存限制
你可以增加 POI 的内存限制,使用 IOUtils.setByteArrayMaxOverride() 来增大最大内存分配限制,不过不太推荐:

IOUtils.setByteArrayMaxOverride(200000000);  // 设置较高的内存限制

3.可以加一个全局的配置,原理和第二中方法一样,就是把这个设置改成全局的,方法有很多,这里就不介绍了

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值