使用AWSiOSSDK.framework从AWS S3下载图像时间过长

时间:2013-01-07 02:48:21

标签: ios amazon-s3

从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秒才能完成。

我在后台使用优先级为DISPATCH_QUEUE_PRIORITY_HIGH的GCD运行它,并且在运行时队列中没有任何其他内容。

任何人都知道为什么要花这么长时间?很乐意提供更多信息。

1 个答案:

答案 0 :(得分:5)

这是一个众所周知的问题,在上传和下载图片方面,仅S3是

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

您要找的是Cloudfront CDN from Amazon。您可以指定原点(在您的情况下将是您的S3存储桶),然后您的文件将分发到全球所有Amazon Cloudfront边缘位置。查看他们的FAQlist of edge locations

您将上传到中央服务器,您的大多数用户都是(估计)。并从签名的URL下载,其中指引您到最靠近包含您的存储桶副本的用户的服务器...您还可以在服务器上缓存图像,以便更快地上传和下载。

另外,我不确定你如何确定path(密钥),但是如果你列出来自S3存储桶的密钥,那就停止吧!它的速度慢!您应该使用DynamoDB或SimpleDB,这两种方法都可以存储小型数据集,DynamoDB速度非常快但不具备查询选项,您可以将所有密钥以特定格式存储到DynamoDB中并匹配它们。

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

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

如果您需要执行所有的详细步骤,我会在您提出问题时给予奖励。从文档中提取这些内容并不容易,但也可以用小时来写,我上学了!

在完成所有这些步骤之后,我减少了大约8秒的时间,几乎是一个拇指!