2017-01-11 15 views
0

私のスクリプトは動作していますが、私がスキャンしているバケットは大量になり、しばらくしてからタイムアウトします。これをより効率的にするため、または特定の場所から開始するために、私は何ができますか?AWS S3バケット内のオブジェクトの反復

import boto3 

s3 = boto3.resource('s3') 
b = s3.Bucket('my_bucket') 

for obj in b.objects.all(): 
    # Open the file, run some RegEx to find some data. If it's found, output to a log file 

私が最初に持っている問題は、バケットのサイズです。約150万のオブジェクトです。私は自分のコードをいくつかのRegExを探しているテキストファイルを開き、RegExに一致するものがあればそれはObject名と何が見つかったのかを出力します。

程度時間スクリプトを実行した後、それがエラーをスローする前には約40Kのオブジェクト行いますので、

requests.exceptions.ConnectionError: ('Connection aborted.', BadStatusLine("''",)) 

または

object at 0x109e82d50>: Failed to establish a new connection: [Errno 60] Operation timed out',)) 

それが通じ検索の検索項目はアルファベット順です私たちはそれが "E"セクションを通過してからタイムアウトすると言うでしょう。私は "F"で始まるオブジェクトで始めることを望みます。

+0

パフォーマンスに関する考慮事項:http://docs.aws.amazon.com/AmazonS3/latest/dev/request-rate-perf-considerations.html – jarmod

+1

Amazon Athenaを試しましたか?これは、S3の大規模データセットを迅速に分析するためのものです。https://aws.amazon.com/athena/ –

答えて

1

1)スクリプトはEC2インスタンスで実行されていますか?ローカルホストまたは独自のデータセンターから実行している場合は、バケットと同じRegion内のEC2インスタンスに移動してそこから実行すると、待ち時間が短縮され、パフォーマンスが向上する可能性があります。あなたはおそらくEC2のインスタンスからそれを実行していますが、私は尋ねると思っていました。あなたは通過するたくさんのファイルを持っています!

2)AWSからAthenaサービスをチェックアウトしましたか? Athenaはインタラクティブなクエリサービスで、S3から直接データをクエリします。 Amazon Athenaは、完全標準のSQLサポートでPrestoを使用し、CSV、JSON、ORC、およびParquetなどのさまざまな標準データ形式で動作します。作業しているテキストデータがAthenaユースケースに合っている場合は、チェックする価値があります。 Athenaは新しいサービスですが、私はそれを使ったことはありませんが、あなたが持っているユースケースに対処するために作成されたようです。ここではよくある質問です:

https://aws.amazon.com/athena/faqs/

1

あなたのAmazon S3バケット内のオブジェクトの数が多い場合、それは同時にメモリにそれらすべてをロードしようとするので、その後objects.all()は、効率的な反復法ではありません。

代わりに、list_objects_v2()を使用して1000のグループのオブジェクトをページします。次に、返されたContinuationTokenで再度呼び出します。

ループでは、list_objects_v2()を呼び出すループと、ループを使用して、それぞれのオブジェクトをループします。

関連する問題