1. ホーム
  2. performance

[解決済み] S3での1ディレクトリあたりの最大ファイル数

2023-03-11 04:46:55

質問

100万枚の画像がある場合、フォルダやサブフォルダの階層構造で保存するのがよいのでしょうか、それともバケツにそのまま(フォルダなしで)放り込むのがよいのでしょうか?

すべての画像を階層構造のないバケットにダンプすると、LIST の動作が遅くなるのでは?

フォルダやサブフォルダをその場で作成し、その ACL を (プログラムで) 設定することに、大きなオーバーヘッドがあるでしょうか?

どのように解決するのですか?

S3は階層的な名前空間を尊重しません。各バケットには、キーからオブジェクトへのマッピングが(関連するメタデータやACLなどと共に)いくつも入っているだけです。

オブジェクトのキーが'/'を含んでいても、S3はパスをプレーンな文字列として扱い、全てのオブジェクトをフラットなネームスペースに置きます。

私の経験では、オブジェクト数が増加すると、LIST操作に(線形に)時間がかかりますが、これはおそらく、Amazonサーバーとクライアントへのワイヤに必要なI/Oが増加することによる症状です。

しかし、検索時間はオブジェクト数とともに増加するようには見えません。これはおそらく、Amazon 側のある種の O(1) ハッシュテーブル実装によるもので、同じバケットに多くのオブジェクトを持つことは、通常の使用 (LIST ではない) では小さなバケットと同じようにパフォーマンスが高いはずです。

ACL については、バケットと個々のオブジェクトにグラントを設定することができます。階層がないため、この 2 つだけが選択肢となります。もちろん、何百万ものファイルがある場合、バケツ全体でできるだけ多くの権限を設定することで、管理者の頭痛の種を大幅に減らすことができますが、以下の権限しかないことを覚えておいてください。 グラント 権限を与えるだけで、それを取り消すことはできません。したがって、バケツ全体の権限は、そのすべてのコンテンツに対する ACL の最大限のサブセットであるべきだということを覚えておいてください。

のために、別々のバケットに分割することをお勧めします。

  • 全く異なるコンテンツ - 画像、音声、その他のデータ用に別々のバケットを持つことで、より正常なアーキテクチャになります。
  • 大幅に異なる ACL - 各オブジェクトに特定の ACL が適用される 1 つのバケットと、異なる ACL が適用されオブジェクト固有の ACL が適用されない 2 つのバケットとがある場合、2 つのバケットを使用します。