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

您已经很好地回答了这个问题;) –