iOS - Amazon S3慢速下载

时间:2012-12-15 14:00:31

标签: iphone ios amazon-web-services amazon-s3 amazon-cloudfront

我正在创建一个iOS应用程序,允许用户编写让我们说状态更新,人们可以对它进行评论,就像它,以多种方式与它进行交互,基本上状态更新有多个属性可以与它一起存储。想象一下,一个应用程序的主屏幕中有超过50个这些状态更新表示在表格视图中。

现在把目光移开,专注于练习/演示应用程序,一个开发人员试图在大型游戏之前掌握技术(对我来说!)所以基本上,我已经开始在新加坡设置一个S3存储桶。我住在新加坡,附近有一台服务器,一切都应该快速顺畅。除此之外,它不是。它很慢,它开始让我恼火。

我知道一个使用S3的应用程序可以加载带有注释,喜欢等的高清全景图像。所有这些数据加载需要花费一秒或多一点。我不确定他们是如何实际执行这个过程的,我知道他们将图像存储在S3上,但这就是我所知道的。在我的入门演示中,我只需上传一些文本(比如20)然后下载它们,在我的60 mbps wifi下需要15秒!这些文本甚至不超过每个句子,它们都是短语,所以我在这里真的很困惑。

我有CloudFront设置,但不适用于网站吗?我有管理发行版和URL的所有设置,但如何在我的代码中设置?这可能是我在其他应用程序中稍后发布的最大问题。即便如此,我住在新加坡并且在新加坡服务器上,因此CloudFront不会强制进行自我测试/练习。

我发现这非常令人困惑,这里有一些我已经制作的带注释的代码,任何问题,导致它变慢的错误概念?

- (void)loadObjects {

S3ListObjectsRequest  *listObjectRequest = [[S3ListObjectsRequest alloc] initWithName: @"testbucketquotes.rohanprostudios"];
S3ListObjectsResponse *listObjectResponse = [[AmazonClientManager s3] listObjects:listObjectRequest];
if(listObjectResponse.error != nil)
{
}
else
{
    S3ListObjectsResult *listObjectsResults = listObjectResponse.listObjectsResult;

    if (objects == nil) {
        objects = [[NSMutableArray alloc] initWithCapacity:[listObjectsResults.objectSummaries count]];
    }
    else {
        [objects removeAllObjects];
    }

    // By defrault, listObjects will only return 1000 keys
    // This code will fetch all objects in bucket.
    NSString *lastKey = @"";
    for (S3ObjectSummary *objectSummary in listObjectsResults.objectSummaries) {

        if ([[objectSummary key] rangeOfString: @"UploadedQuote"].location != NSNotFound) {

        [objects addObject:[objectSummary key]];
        lastKey = [objectSummary key];

        }
    }

    while (listObjectsResults.isTruncated) {
        listObjectRequest = [[S3ListObjectsRequest alloc] initWithName: @"testbucketquotes.rohanprostudios"];
        listObjectRequest.marker = lastKey;

        listObjectResponse = [[AmazonClientManager s3] listObjects:listObjectRequest];
        if(listObjectResponse.error != nil)
        {                
            break;
        }

        listObjectsResults = listObjectResponse.listObjectsResult;

        for (S3ObjectSummary *objectSummary in listObjectsResults.objectSummaries) {

            if ([[objectSummary key] rangeOfString: @"UploadedQuote"].location != NSNotFound) {

                [objects addObject:[objectSummary key]];

            }

            lastKey = [objectSummary key];
        }
    }

    if (objects.count) {

        for (int i = 0; i <= objects.count - 1; i++) {

            S3GetObjectRequest *req = [[S3GetObjectRequest alloc] initWithKey:[objects objectAtIndex: i] withBucket: @"testbucketquotes.rohanprostudios"];

            `// asynchronously loads text (adds to operation queue)`
            AsyncQuoteDownloader *quote = [[AsyncQuoteDownloader alloc] initWithRequest:req andViewController: self];

            [operationQueue addOperation: quote]; 
            // in 'AsyncQuoteDownloader' when finished calls a method in this view controller adding the response to an array and reloading a table
        }

    }
  }

});
 }

我的代码有什么问题导致它滞后这么多?如果成像服务需要1秒钟来加载带有喜欢和评论等的HQ图像需要1-2秒,我本以为这需要几毫秒。

感谢您的帮助......

更新


好的,所以键的迭代似乎不是问题,而是下载对象。有什么想法吗?感谢...

3 个答案:

答案 0 :(得分:1)

这是我第一次见到Objective C,所以我在这里可能完全错了。但是......看起来你正在遍历整个桶的键。任何可观的钥匙数量都会非常非常慢。

更好的设计是在DynamoDB中存储查找表(因为您已经在使用AWS)。你在那里查询,得到一个匹配id(S3键)的数组,然后从S3获取匹配对象。

答案 1 :(得分:1)

我在自己的iOS应用程序中使用的另一个选项是使用Heroku作为应用程序层并创建指向您的内容的POSTGRESQL记录。通过这种方式,您可以在rails中创建丰富的查询,并使用Rails的强大功能调解上载和下载,而不是为DynamoDB和S3付费。

答案 2 :(得分:0)

原来我的水桶被设置到美国地区而不是新加坡地区... #doh

它现在更快,工作正常

我只需要将AmazonS3Client的端点设置为新加坡(SEA)区域