当我尝试将大文件拆分为块时出现 Java 堆空间错误

问题描述 投票:0回答:1

我正在尝试将一个大文件(> 20GB)分割成块来上传。

这是我的方法:

   public List<byte[]> chunkFile() throws IOException {
        File file = new File(backupPath);

        List<byte[]> chunks = new ArrayList<>();

        try (FileInputStream fis = new FileInputStream(file)) {
            byte[] buffer = new byte[1024 * 1024 * 10];

            int bytesRead;

            while ((bytesRead = fis.read(buffer)) > 0) {
                byte[] chunk = new byte[bytesRead];
                System.arraycopy(buffer, 0, chunk, 0, bytesRead);
                chunks.add(chunk);
            }
            return chunks;
        }
    }

它适用于小文件(500mb),但是当我尝试使用更大的文件时,我遇到了这个错误:

路径 [] 上下文中 servlet [dispatcherServlet] 的 Servlet.service() 抛出异常 [处理程序调度失败:java.lang.OutOfMemoryError:Java 堆空间],其根本原因

java.lang.OutOfMemoryError:Java 堆空间

我需要将文件分割成块,以便能够使用多部分文件上传到 s3。

java out-of-memory chunks
1个回答
0
投票

您不能将 20Gb 放入堆中。即使您增加堆大小,这也将是一个非常糟糕的做法。

创建一个缓冲区并在创建后立即上传每个块。重用相同的缓冲区来加载下一个块。

您也可以使用临时文件。

© www.soinside.com 2019 - 2024. All rights reserved.