3

AWSS3から700KBのイメージファイルをダウンロードするのに約7.5秒かかります。

AWSS3からイメージをダウンロードするためにこのメソッドを作成しました。

+ (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秒かかります。

優先度の高いGCDを使用してバックグラウンドで実行していDISPATCH_QUEUE_PRIORITY_HIGHますが、実行時にキューに他に何もありません。

なぜそんなに時間がかかるのか誰もが知っていますか?より多くの情報を提供させていただきます。

4

1 に答える 1

6

これは既知の問題です。画像のアップロードとダウンロードに関しては、S3だけでは低速です。

CloudFrontを有効にして他のAWSサービスを使用する場合、実際には問題ありません。

探しているのは、AmazonのCloudfrontCDNです。オリジン(この場合はS3バケット)を指定すると、ファイルが世界中のすべてのAmazonCloudfrontエッジロケーションに配信されます。彼らのFAQエッジの場所のリストをチェックしてください。

ユーザーの大多数がいる中央サーバーにアップロードします(見積もり)。また、バケットのコピーを含むユーザーに最も近いサーバーに移動する署名付きURLからダウンロードします...サーバーに画像をキャッシュして、アップロードとダウンロードを高速化することもできます。

pathまた、 (キー)をどのように決定するかはわかりませんが、S3バケットからキーを一覧表示する場合は、それを停止してください。その遅い!小さなデータセットを保存する代わりに、DynamoDBまたはSimpleDBを使用する必要があります。DynamoDBは超高速ですが、実際にはクエリオプションがありません。すべてのキーを特定の形式でDynamoDBに保存し、それらを一致させることができます。

SimpleDBを使用して、関連する属性(プロパティ)を持つすべてのキーを保存し、SQLと同様のSELECT式を使用してSimpleDBにクエリを実行できますが、構文は少し異なります。

S3を最適化するためにできることはたくさんあります!

すべてのことについて詳細な手順が必要な場合は、質問に賞金をかければ私が行います。ドキュメントからこれを拾うのは簡単ではありませんが、書くのにも何時間もかかる可能性があり、私には学校があります!

これらすべての手順を実行した後、私は約8秒をほぼ親指のスナップに短縮しました!

于 2013-01-08T14:19:04.897 に答える