2016-08-13 22 views
1

根據listing documentation,可以像處理分層存儲那樣處理大量導航數量的鍵。我打算存儲大量的密鑰(比方說幾億),分佈在一個合理大小的「層次結構」中。帶有前綴和分隔符的清單S3存儲桶的性能

使用前綴和分隔符的性能如何?是否需要在S3端完全枚舉鍵,因此是O(n)操作?我不知道密鑰是否存儲在一個大的哈希表中,或者它們是否具有索引數據結構,或者它們是否存儲在樹中或什麼。

我想避免這種情況,我擁有大量的按鍵,導航「層次結構」突然變得困難。

所以,如果我有以下鍵:

  • abc/def/ghi/0
  • abc/def/ghi/1
  • abc/def/ghi/...
  • abc/def/ghi/100,000,000,000

不會影響查詢Delimiter='/, Prefix='abc/def'的速度?

回答

2

只要你沒有在前綴中使用連續的順序(如日期2016-13-08,2016-13-09等),你不應該面臨任何問題。如果您的密鑰是作爲連續序列自動生成的,那麼將隨機生成的哈希鍵添加到鍵(aidk-2016-13-08,ujlk-2016-13-09)。 亞馬遜文檔說:

Amazon S3維護每個AWS區域中對象鍵名的索引。對象鍵以索引中多個分區的UTF-8二進制排序存儲。密鑰名稱表示密鑰存儲在哪個分區。使用序列前綴(例如時間戳或字母順序)可增加Amazon S3針對大量密鑰的特定分區的可能性,從而壓倒I/O容量的分區。如果在密鑰名稱前綴中引入了一些隨機性,則密鑰名稱以及I/O負載將分佈在多個分區中。

http://docs.aws.amazon.com/AmazonS3/latest/dev/request-rate-perf-considerations.html

+1

謝謝。我讀過它,但它似乎與關鍵「層次結構」中給定點處迭代的大O複雜性無關。 – Joe

3

除了從Request Rate and Performance Considerations文檔桑迪普引用(這並不適用於你的使用情況),AWS還沒有公佈很多關於S3的性能。這可能是私人知識產權。所以我懷疑你會發現很多信息,除非你可以直接從AWS獲得它。

然而,有些事情要記住:

  1. 亞馬遜S3是專爲大規模。數以百萬計的公司正在使用S3,在數百萬桶中使用數百萬個密鑰。
  2. AWS推廣前綴+分隔符作爲非常有效的用例。
  3. AWS在計算機科學中使用的常用數據結構和算法可能在幕後使用,以有效檢索密鑰。一種這樣的數據結構稱爲Trie或前綴樹。

基於以上所有情況,當您檢索密鑰列表時,很有可能比訂購O(n)算法好得多。我認爲您可以安全地爲您的層次結構使用前綴和分隔符。

+0

謝謝,那也是我的直覺。我正在尋找一些確認。讓我三思而後行的是,前綴和分隔符是任意的,這意味着一個簡單的線索並不理想。 – Joe

+0

嘗試使用任意前綴美妙地工作,這是他們的目的。一旦你沿樹中的節點(在你的前綴的長度上將是O(n)),只有子節點是用於檢索的候選者。你永遠不會看你的前綴。當檢索子節點時,當你敲擊定界符節點時,停止遍歷樹,從而迅速消除這些鍵。 –

+1

我剛剛測試了這個,使用List Objects V1 API在具有〜1000萬個對象的存儲桶上進行,其中對象以「image/a/b/c/abcdef ...」形式存儲,其中/ b/c是文件sha的前3個十六進制數字......所以有16個前綴,通過'image/f /'調用'image/0 /',並且對象在整個按鍵空間中均勻分佈,還有兩個「級別」分隔符。使用'delimiter = /&前綴=圖像/'請求一個桶列表返回所有16個期望的'的列表,並且在一個命中API的情況下在225ms內顯然比O(n)好。他們如何做它不知道。 +1 –

相關問題