从Azure表结构中读取N个实体的最有效方法是什么

时间:2012-12-06 11:18:05

标签: asynchronous azure parallel-processing task-parallel-library

背景 - 将使用.NET 4.0,Azure SDK 1.7,Azure表存储

问题 如何最有效地(=最快处理时间)读取N个条目,其中N是一个大的#(1000到数百万)个实体,并且每个实体都是一组Azure表中的非常小(<200字节),其中前面是我知道每个实体的PartitionID和RowID,即[(P1,R1),(P2,R2),...,(PN,RN)]。

“批处理”处理此类请求的最有效方法是什么。当然,在下面需要异步/并行化提取,而不是通过IO锁或Synchonisation锁导致线程锁,理想情况下,我应该看到CPU达到&gt; 80%的吞吐量,服务器调用Azure Table存储,如此处理应该是CPU绑定与IO或内存绑定。

1 个答案:

答案 0 :(得分:4)

由于您要求从Azure存储中读取“最快”的处理时间,因此以下是一些使我的性能得到改善的一般提示(最重要的是最重要的):

  1. 确保自2012年7月以来创建了Azure存储。这是Azure存储的Gen2,它包含SSD驱动器上的存储。

  2. 在您的情况下,表存储增加了Azure存储Gen2分区的可伸缩性目标:http://blogs.msdn.com/b/windowsazure/archive/2012/11/02/windows-azure-s-flat-network-storage-and-2012-scalability-targets.aspx

    • 10 Gbps网络与1 Gpbs网络
    • 单个分区可以处理20,000个实体/秒
  3. .NET默认连接会更改此数字(我认为这可能会在新SDK中解决,但不确定):http://social.msdn.microsoft.com/Forums/en-US/windowsazuredata/thread/d84ba34b-b0e0-4961-a167-bbe7618beb83

  4. 您可以“加热”Azure存储,它看到的事务越多,它将使用的控制器/驱动器缓存越多。以这种方式持续打击您的存储可能会很昂贵

  5. 您可以使用MULTIPLE Azure存储帐户。这可以非常有效地分配您的负载(分片):http://tk.azurewebsites.net/2012/08/26/hacking-azure-for-more-disk-performance/

  6. 您可以通过多种方式在Table Storage中进行架构/设计。您有分区键和行键。但是,您还拥有表本身..记住这是NoSQL,因此您可以拥有100个具有相同结构的表来提供不同的数据。这可以提高性能,也可以将这些表存储在不同的Azure存储帐户中。 RowKey-&GT; PartitionKey - &gt;表 - &gt;多个存储帐户都可以被视为“索引”以便更快地访问

  7. 我不知道你的数据,但是因为你将在PartitionKey上搜索(我假设),也许不是为每个PartitionKey存储1,000,0000个非常小的记录,而是在zip文件中获取它并快速获取/解压缩然后在本地服务器中使用linq并行查询它。使用缓存总是有帮助,因为你有很多小对象。您可以将整个分区放在内存中。另一种选择可能是存储分区键,其中列数据是二进制/逗号分隔等。

  8. 您说您使用的是Azure 1.7 SDK ...我遇到了问题并使用了StorageClient 2.0库。我将1.8 SDK与StorageClient 2.0库一起使用。有些注意事项(不一定是性能),因为它们可能在过去2年多来提高了图书馆的效率