[英]IOUtils.copy() with input and output streams is extremely slow
作为我的Web服务的一部分,我有一个图片存储库,该存储库从Amazon S3(数据存储)中检索图像,然后将其返回。 这是执行此操作的方法的外观:
File getPicture(String path) throws IOException {
File file = File.createTempFile(path, ".png");
S3Object object = s3Client.getObject(new GetObjectRequest(bucketName, path));
IOUtils.copy(object.getObjectContent(), new FileOutputStream(file));
return file;
}
问题是从服务获得响应花费的时间太长-(一个3MB的图像花了7.5秒下载时间)。 我注意到,如果我注释掉IOUtils.copy()行,则响应时间明显加快,因此,一定是导致这种延迟的特定方法。
我已经在几乎所有将S3Object转换为文件的现代示例中都使用了这种方法,但是我似乎是一个特例。 我在这里错过了一个把戏吗?
感谢任何帮助!
从AWS文档中:
public S3Object getObject(GetObjectRequest getObjectRequest)
返回的Amazon S3对象包含来自HTTP连接的直接数据流。 在用户完成读取数据并关闭流之前,基础HTTP连接无法重用。
public S3ObjectInputStream getObjectContent()
注意:该方法是一个简单的getter,实际上并不创建流。 如果您检索S3Object,则应尽快关闭此输入流,因为对象内容不会在内存中缓冲,而不会直接从Amazon S3流。
如果删除IOUtils.copy
行,则方法会快速退出,因为您实际上并未处理该流。 如果文件很大,将需要一些时间来下载。 除非您可以更好地连接到AWS服务,否则您将无能为力。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.