3

从 AWS S3 下载一个 700 KB 的图像文件大约需要 7.5 秒。

我编写了这个方法来从 AWS S3 下载图像:

+ (UIImage *)downloadImageFromPath:(NSString *)path
{
    NSDate *methodStart = [NSDate date];

    S3GetObjectRequest *getObjectRequest = [[S3GetObjectRequest alloc] initWithKey:path withBucket:AWS_BUCKET];

    AmazonS3Client *s3 = [[AmazonS3Client alloc] initWithAccessKey:ACCESS_KEY_ID withSecretKey:SECRET_KEY];

    S3GetObjectResponse *response;
    @try
    {
        response = [s3 getObject:getObjectRequest];
    }
    @catch(NSException* ex)
    {
        return [UIImage imageNamed:@"blank.jpg"];
    }

    NSData *data = response.body;
    UIImage *image = [UIImage imageWithData:data];

    NSDate *methodFinish = [NSDate date];
    NSTimeInterval executionTime = [methodFinish timeIntervalSinceDate:methodStart];
    NSLog(@"executionTime = %f", executionTime);

    return image;
}

我只是在方法的开头和结尾添加了代码。

正如我上面提到的,它需要大约 7.5 秒才能完成。

我使用 GCD 在后台运行它,DISPATCH_QUEUE_PRIORITY_HIGH它运行时队列中没有其他内容。

有谁知道为什么要花这么长时间?很乐意提供更多信息。

4

1 回答 1

6

这是一个已知问题,仅 S3在上传和下载图像时速度很慢。

好吧,当您启用 CloudFront 并使用其他 AWS 服务时,这实际上不是问题。

您正在寻找的是来自 Amazon 的 Cloudfront CDN。您可以指定一个来源(在您的情况下是您的 S3 存储桶),然后您的文件将分发到全球所有 Amazon Cloudfront 边缘位置。查看他们的常见问题解答边缘站点列表

您将上传到您的大多数用户所在的中央服务器(估计)。并从签名 URL 下载,该 URL 会将您定向到距离用户最近的服务器,其中包含您的存储桶副本……您还可以将图像缓存在服务器上,以加快上传和下载速度。

另外,我不确定您如何确定path(密钥),但如果您要列出 S3 存储桶中的密钥,请停止!它的慢!您应该使用 DynamoDB 或 SimpleDB,它们都是存储小型数据集的替代方案,DynamoDB 速度超快但实际上没有查询选项,您可以将所有键以某种格式存储到 DynamoDB 中并匹配它们。

您可以使用 SimpleDB 并存储所有具有相关属性(属性)的键,并使用类似于 SQL 的 SELECT 表达式查询 SimpleDB——但语法略有不同

您可以做很多事情来优化 S3!

如果您需要关于所有事情的详细步骤,如果您悬赏这个问题,我会这样做。从文档中获取这一点并不容易,但也可能需要我几个小时才能写出来,而且我有学校!

完成所有这些步骤后,我将大约 8 秒的时间缩短到了拇指的瞬间!

于 2013-01-08T14:19:04.897 回答