完整错误:
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.可以加一个全局的配置,原理和第二中方法一样,就是把这个设置改成全局的,方法有很多,这里就不介绍了
6499

被折叠的 条评论
为什么被折叠?



