0

我有一个包含超过一百万个条目的 Azure 表,我试图以编程方式执行大约 300,000 个查询C#,以便将一些数据传输到另一个系统。目前,当我阅读具有分区和行键的文件时,我正在执行以下操作:

while (!reader.EndOfStream)
{
    // parse the reader to get partition and row keys
    string currentQuery = TableQuery.CombineFilters(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partKey), TableOperators.And, TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, rowKey));
    TableQuery<MyEntity> query = new TableQuery<MyEntity>().Where(currentQuery);

    foreach (MyEntity entity in table.ExecuteQuery(query))
    {
        Console.WriteLine(entity.PartitionKey + ", " + entity.RowKey + ", " + entity.Timestamp.DateTime);
    }

    Thread.Sleep(25);
}

这需要很长时间才能完成(5 个多小时)。从我所见,查询平均需要大约 200 毫秒。我对 Azure 有点陌生,所以我认为我做错了什么。我该如何改进它?

4

1 回答 1

2

一些东西:

  1. 不知道为什么你的循环中有一个睡眠呼叫。除非您受到限制(存储支持每秒 20,000 个事务),否则您不需要这样做。
  2. 使用给定的分区键和行键,您将得到一个返回的实体(因为组合 pk+rk 是唯一的)。无需遍历您的结果。你要么得到零,要么得到一。
  3. 您正在采用单线程方法,因此您不太可能非常努力地推动存储事务率。考虑并行化您的检索。
  4. 我假设您没有Console.Writeline()在您的实际应用程序中调用。如果是这样,这也会减慢您的速度。
  5. 考虑禁用 Nagle 算法,通过ServicePointManager.UseNagleAlgorithm = false;. 否则,对存储的单个低级调用可能会被缓冲长达 500 毫秒,以更密集地打包 tcp 数据包。如果您花费周期处理您阅读的内容,这将很重要。
于 2015-09-17T20:34:20.277 回答