1

我有一個2 GB散列的存儲,我想用公共Api來檢查。如何使用Azure表存儲器進行大量查找

使用案例

比方說,我想創建它檢查是否一個人被我的產品聞名的API。 尊重個人隱私我不想上傳他的名字,會員ID等。 所以我決定只上傳一個散列的組合信息,它將識別他。 現在我有2 GB(6 * 10^7)的SHA256哈希值,並想檢查他們在瘋狂快速的方式。

此API應該以azure託管。

未讀完Azure存儲帳戶的文檔後,我認爲Azure表存儲是正確的存儲解決方案。 我將base64散列設置爲分區鍵,並將行鍵保留爲空

問題

  1. 首先,是Azure Table中作業的正確的存儲?
  2. 會不會是與不同的性能:
    1. 分區鍵:BASE64散,行鍵:空
    2. 分區鍵: '上傳ID',行鍵:empbase64哈希
  3. 請問訪問槽鍵的時間取決於表的大小?
  4. 什麼是檢查分區密鑰是否存在的最快方法? 我覺得我天真的第一次嘗試並不是最好的方法。

    如果(members.Where(X => x.PartitionKey == Convert.ToBase64String(data.Hash))。AsEnumerable()。在任何()){ 返回 req.CreateResponse(HttpStatusCode.OK,「發現哈希「); } else { return req.CreateResponse(HttpStatusCode.NotFound,「Do not found Hash」); }

  5. 如何上傳2 GB的散列? 我想上傳一個大文件,並使用azure函數在每個256位之後分割並將值添加到azure存儲。或者更好的想法?

+0

很抱歉的壞格式的代碼塊,我無法正確格式化。 –

+0

#1沒有正確的答案。如果您正在進行分區掃描或表掃描,您的查詢將隨着您的表的增長而絕對變慢(#3)。 #4不能沒有表掃描(或您跟蹤另一個表中的所有分區鍵)。 #5是一個完全不同的話題。但爲什麼你會留下一行空鍵?這是沒有意義的。 –

+0

「但是你爲什麼要把一行鑰匙留空?這沒有任何意義。」你如何設計它,如果你只需要查找? –

回答

3

我拿到這個:

  1. 如果您需要的是「檢查是否存在散存在」(如果需要檢索其詳細信息)的唯一查詢,則表存儲是絕配。重要的查找速度快,價格便宜,而2 GB則毫無用處。

  2. 散列給出了最多樣性,所以我會用它作爲分區鍵。行鍵可以是任何東西。如果Upload Id從不用於(範圍)查找,請不要將其用於鍵。

  3. 使用適當的分區鍵時,查找時間應該是恆定的。

  4. 如果你的意思是你需要檢查用戶散列是否存在,只需通過分區鍵+行鍵檢索一行。這是可能的最快的操作。請參閱「檢索單個實體」here

  5. 表存儲支持批量插入。此外,2GB的並不多,你可能花更多的時間在問這個問題比你的上傳將採取:)

+0

使用「上傳Id」是因爲每年的每個季度添加一個新的數據集並刪除最後一個(大約6個將出現)。所以我可以使用'季度和年度'+哈希。 –

+0

@dh_cgn您是否總是在最後的數據集,給定的數據集或所有6個數據集中查找? – Mikhail

+0

跨所有6個數據集。 –

0

我看到這個標記有Azure的功能,因此我會補充說Azure的功能可以讓你直接綁定到表格存儲。請參閱https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-table

您甚至可以直接綁定到特定實體。 的function.json會是什麼樣子:

{ 
    "name": "<Name of input parameter in function signature>", 
    "type": "table", 
    "direction": "in", 
    "tableName": "<Name of Storage table>", 
    "partitionKey": "<PartitionKey of table entity to read - see below>", 
    "rowKey": "<RowKey of table entity to read - see below>", 
} 
+0

雖然這對分區問題沒有幫助:) – Mikhail

+0

您已經很好地回答了這個問題;) –