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

ill*_*ors 2 amazon-s3 ios

从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;
}
Run Code Online (Sandbox Code Playgroud)

我刚开始添加代码并结束时间方法.

正如我上面提到的,完成需要大约7.5秒.

我在后台使用GCD优先运行它DISPATCH_QUEUE_PRIORITY_HIGH,并且在运行时队列中没有其他内容.

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

MCK*_*pur 5

这是一个已知问题,当涉及到图像的上传和下载时,单独的S3很.

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

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

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

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

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

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

如果你需要做一些事情的详细步骤,如果你在问题上给予赏金,我会这样做.从文档中提取它并不容易,但也可能花费我几个小时来写,我上学了!

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