【发布时间】:2021-03-12 10:01:03
【问题描述】:
在我们的系统中,我们调用的是 S3 服务器的后端。并尝试通过 java 服务将文件流式传输到客户端。问题是对于大文件(> 2 GiB),我们得到一个 java 堆错误。该流适用于较小的文件,但不适用于最大的文件。我们正在使用 minio 客户端获取数据,然后在响应中将其流式传输。
final InputStream is = s3client()
.getObject(GetObjectArgs.builder().bucket(bucket)
.object(path).build());
StreamingOutput fileStream = output -> {
try {
int nRead;
byte[] data = new byte[8 * 1024];
while ((nRead = is.read(data)) != -1) {
output.write(data, 0, nRead);
}
is.close();
output.flush();
} catch (IOException e) {
throw new WebApplicationException("IOException while streaming data!", e);
}
};
return Response
.ok(fileStream, contentType)
.build();
我不认为数据应该提供堆空间错误,因为我们(希望在我看来)正在覆盖 while 循环中所有条目的分配。所以我想知道隐藏的输出或输入流中是否存在增加堆空间的东西。
【问题讨论】:
-
您确定问题出在 S3 部分而不是您的输出吗??
-
@MrR:我目前还不确定。当我在 chrome 中测试常规 Web 窗口中的链接时会发生错误,这可能意味着它没有正确使用输出。我只是难倒atm。因为我认为一旦接收客户端在响应中调用写入,写入就开始了。
-
什么是
output- 如果它在内存中,您正在将一个完整的内容写入内存..如果它是 2GiB 文件大小并且您的虚拟机没有分配足够的堆,您将收到一个堆外错误。
标签: java jax-rs streaming minio