2017-06-13 13 views
3

ローカルファイルがダウンロードされずにS3に保存されたファイルと同じかどうかを確認するにはどうすればよいですか?大きなファイルを何度も何度もダウンロードしないようにする。 S3オブジェクトは電子タグを持っていますが、ファイルがアップロードされた場合は計算が難しく、このquestionからの解決策は機能していません。不要なダウンロードを避ける簡単な方法はありますか?ローカルファイルがboto3でダウンロードせずにS3オブジェクトと同じかどうかを確認するにはどうすればいいですか?

+0

最後に変更した時間を比較してみませんか? – helloV

答えて

3

私はちょうど最後の修正された時間を比較して、それらが異なっているならダウンロードします。さらに、ダウンロードする前にサイズを比較することもできます。あなたはすぐに在庫を必要としない場合、あなたはその後、s3 storage inventoryを生成し、将来の使用のためにデータベースにインポートすることができ

import boto3 
import os.path 

def isModified(bucket, key, fname): 
    s3 = boto3.resource('s3') 
    obj = s3.Object(bucket, key) 
    return int(obj.last_modified.strftime('%s')) != int(os.path.getmtime(fname)) 
+0

合意。ファイル名+サイズ+修正時間は通常十分です。物事が変更されていないことを100%保証する必要がある場合は、ETagを使用してください。 –

1

小さなローカルデータベースを使用できますか?テキストファイルですか?

  • S3オブジェクトを1回ダウンロードします。そのETagではありません。
  • 必要な署名を計算します。
  • (ETag、署名)のペアを「データベース」に入れます。

次回、ダウンロードを続行する前に、「データベース」でETagを参照してください。存在する場合は、既存のファイルの署名を計算し、ETagに対応する署名と比較します。一致した場合、リモートファイルは同じファイルになります。

異なるチャンクで同じファイルが再アップロードされ、ETagが変更される可能性があります。これが可能性が高い場合を除き、偽陰性を無視してそのまれなケースでファイルを再ダウンロードすることができます。

+1

"データベース"はS3オブジェクトタグになります。そうすれば、余分なリソースは必要なくなり、オブジェクトパス/キーが変更された場合でも署名を再計算する必要はありません。 –

+0

私はそれが動作すると思う、または私はちょうど署名を計算し、S3オブジェクトにメタデータとしてそれを添付することができます。これは非常に標準的な操作であり、独自の解決法を書かなければならない方法があるはずです。また、 'aws s3 sync'コンソールコマンドがどのように動作するのか不思議です。 – DikobrAz

+0

[5GBを超えるファイルに対してAmazon-S3 Etagを計算するアルゴリズムとは何ですか?](https://stackoverflow.com/questions/12186993/what-is-the-algorithm-to-compute- the-amazon-s3-etag-for-a-file-5gbより大きい)を使用して自分自身を計算することができますが、それをデータベースに格納すると繰り返し実行する必要はありません。 –

関連する問題