从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,并且在运行时队列中没有其他内容.
任何人都知道为什么这么长时间?很乐意提供更多信息.
这是一个已知问题,当涉及到图像的上传和下载时,单独的S3很慢.
嗯,当您启用CloudFront并使用其他AWS服务时,它实际上不是问题.
您正在寻找的是来自亚马逊的Cloudfront CDN.您可以指定原点(在您的情况下将是您的S3存储桶),然后您的文件将分发到全球所有Amazon Cloudfront边缘位置.查看他们的常见问题解答和边缘位置列表.
您将上传到中央服务器,您的大多数用户将是(估计).并从签名的URL下载,其中将您引导至最接近包含您的存储桶副本的用户的服务器...您还可以在服务器上缓存图像以更快地上载和下载.
此外,我不确定你如何确定path(密钥),但如果你列出来自S3存储桶的密钥,请停止它!它的速度慢!您应该使用DynamoDB或SimpleDB,这两种方法都可以存储小数据集,DynamoDB速度非常快,但实际上没有查询选项,您可以将所有键存储到具有特定格式的DynamoDB中并匹配它们.
您可以使用SimpleDB并使用相关属性(属性)存储所有密钥,并使用类似于SQL的SELECT表达式查询SimpleDB - 但语法略有不同
你可以做很多事情来优化S3!
如果你需要做一些事情的详细步骤,如果你在问题上给予赏金,我会这样做.从文档中提取它并不容易,但也可能花费我几个小时来写,我上学了!
完成所有这些步骤后,我减少了大约8秒的时间,几乎是拇指的瞬间!
| 归档时间: |
|
| 查看次数: |
4073 次 |
| 最近记录: |