从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运行它,并且在运行时队列中没有任何其他内容。
任何人都知道为什么要花这么长时间?很乐意提供更多信息。
答案 0 :(得分:5)
这是一个众所周知的问题,在上传和下载图片方面,仅S3是慢。
当您启用CloudFront并使用其他AWS服务时,它实际上不是问题。
您要找的是Cloudfront CDN from Amazon。您可以指定原点(在您的情况下将是您的S3存储桶),然后您的文件将分发到全球所有Amazon Cloudfront边缘位置。查看他们的FAQ和list of edge locations。
您将上传到中央服务器,您的大多数用户都是(估计)。并从签名的URL下载,其中指引您到最靠近包含您的存储桶副本的用户的服务器...您还可以在服务器上缓存图像,以便更快地上传和下载。
另外,我不确定你如何确定path
(密钥),但是如果你列出来自S3存储桶的密钥,那就停止吧!它的速度慢!您应该使用DynamoDB或SimpleDB,这两种方法都可以存储小型数据集,DynamoDB速度非常快但不具备查询选项,您可以将所有密钥以特定格式存储到DynamoDB中并匹配它们。
您可以使用SimpleDB并使用相关属性(属性)存储所有密钥,并使用类似于SQL的SELECT表达式查询SimpleDB - 但语法略有不同
您可以做很多事情来优化S3!
如果您需要执行所有的详细步骤,我会在您提出问题时给予奖励。从文档中提取这些内容并不容易,但也可以用小时来写,我上学了!
在完成所有这些步骤之后,我减少了大约8秒的时间,几乎是一个拇指!