执行大量 Azure Table 查询的最佳方法?
Best way to do a large amount of Azure Table Queries?
我有一个 Azure table,它有超过一百万个条目,我正试图在 C#
中以编程方式执行大约 300,000 个查询,以便将一些数据传输到另一个系统。目前,我在阅读具有分区键和行键的文件时正在执行以下操作:
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 有点陌生,所以我觉得我做错了什么。我该如何改进它?
一些事情:
- 不确定为什么循环中有睡眠调用。除非您受到限制(存储支持每秒 20,000 个事务),否则您不需要它。
- 使用给定的分区键和行键,您将得到一个返回的实体(因为组合 pk+rk 是唯一的)。无需遍历您的结果。你要么得到零,要么得到一个。
- 您采用的是单线程方法,因此您不太可能非常努力地提高存储事务处理率。考虑并行化检索。
- 我假设您没有在实际应用中调用
Console.Writeline()
。如果是这样,这也会减慢您的速度。
- 考虑通过
ServicePointManager.UseNagleAlgorithm = false;
禁用 Nagle 算法。否则,对存储的单个低级调用可能会缓冲长达 500 毫秒,以更密集地打包 tcp 数据包。如果您花时间处理阅读的内容,这将很重要。
我有一个 Azure table,它有超过一百万个条目,我正试图在 C#
中以编程方式执行大约 300,000 个查询,以便将一些数据传输到另一个系统。目前,我在阅读具有分区键和行键的文件时正在执行以下操作:
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 有点陌生,所以我觉得我做错了什么。我该如何改进它?
一些事情:
- 不确定为什么循环中有睡眠调用。除非您受到限制(存储支持每秒 20,000 个事务),否则您不需要它。
- 使用给定的分区键和行键,您将得到一个返回的实体(因为组合 pk+rk 是唯一的)。无需遍历您的结果。你要么得到零,要么得到一个。
- 您采用的是单线程方法,因此您不太可能非常努力地提高存储事务处理率。考虑并行化检索。
- 我假设您没有在实际应用中调用
Console.Writeline()
。如果是这样,这也会减慢您的速度。 - 考虑通过
ServicePointManager.UseNagleAlgorithm = false;
禁用 Nagle 算法。否则,对存储的单个低级调用可能会缓冲长达 500 毫秒,以更密集地打包 tcp 数据包。如果您花时间处理阅读的内容,这将很重要。