繁体   English   中英

具有输入和输出流的IOUtils.copy()非常慢

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM