Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
建议的方法是从Azure表存储中提取1000条单独的记录?_Azure_Azure Table Storage - Fatal编程技术网

建议的方法是从Azure表存储中提取1000条单独的记录?

建议的方法是从Azure表存储中提取1000条单独的记录?,azure,azure-table-storage,Azure,Azure Table Storage,我有一个Azure表存储,其中包含数百个远程设备的分钟遥测数据。数据由连接设备id、位置id、日期和年份的键进行分区。因此,作为一个例子,如果我想为任何给定的设备提取整整一个月的数据,我需要从30个分区中提取所有数据 对于一个特定的计算,我只需要在一小时的顶部和底部加上时间戳的记录,即分钟分别为0和30的时间。目前,为了做到这一点,我创建了一个任务数组,分别提取每条记录并并行获取它们(一个月内,这是1440-我知道每条记录的分区键和行键,因此我可以使用TableOperation.Retriev

我有一个Azure表存储,其中包含数百个远程设备的分钟遥测数据。数据由连接设备id、位置id、日期和年份的键进行分区。因此,作为一个例子,如果我想为任何给定的设备提取整整一个月的数据,我需要从30个分区中提取所有数据

对于一个特定的计算,我只需要在一小时的顶部和底部加上时间戳的记录,即分钟分别为0和30的时间。目前,为了做到这一点,我创建了一个任务数组,分别提取每条记录并并行获取它们(一个月内,这是1440-我知道每条记录的分区键和行键,因此我可以使用TableOperation.Retrieve(partitionKey,rowKey)方法。下面的代码说明了该方法:

var tasks = new List<Task<TableResult>>();
foreach (var date in dates)
{
    foreach (var timeOfDay in checkTimes)
    {
        var dateTimeLocal = date.Add(TimeSpan.Parse(timeOfDay));
        var dateTimeUtc = Helper.ConvertLocalTimeToUtcTime(location.TimeZoneId, dateTimeLocal);

        var partitionKey = location.RowKey + "_" + deviceGuid + "_" + dateTimeUtc.DayOfYear + "_" + dateTimeUtc.Year;
        var rowKey = dateTimeUtc.ToString("yyyy-MM-ddTHH:mm:00");

        var table = TableHelper.GetTable(Data.StorageString, "table");
        var retrieveOperation = TableOperation.Retrieve<DataEntities.EnergyData>(partitionKey, rowKey);
        tasks.Add(table.ExecuteAsync(retrieveOperation));
    }
}

await Task.WhenAll(tasks.ToArray());

var demandData = tasks.Where(c => c.Result.Result != null).Select(c => (DataEntities.EnergyData)c.Result.Result).ToArray();
var tasks=newlist();
foreach(日期中的var日期)
{
foreach(检查时间中的var timeOfDay)
{
var dateTimeLocal=date.Add(TimeSpan.Parse(timeOfDay));
var dateTimeUtc=Helper.convertLocalTimeToutTime(location.TimeZoneId,dateTimeLocal);
var partitionKey=location.RowKey+“”+deviceGuid+“”+dateTimeUtc.DayOfYear+“”+dateTimeUtc.Year;
var rowKey=dateTimeUtc.ToString(“yyyy-MM-ddTHH:MM:00”);
var table=TableHelper.GetTable(Data.StorageString,“table”);
var retrieveOperation=TableOperation.Retrieve(partitionKey,rowKey);
tasks.Add(table.ExecuteAsync(retrieveOperation));
}
}
等待Task.WhenAll(tasks.ToArray());
var demandData=tasks.Where(c=>c.Result.Result!=null).选择(c=>(DataEntities.EnergyData)c.Result.Result).ToArray();
dates数组包含我要聚合的每一天的datetimes(午夜),checkTimes是我每天感兴趣的时间

对于一个月的数据(约1440条记录),这种方法可能比只提取一个月的每条记录并在内存中过滤我感兴趣的记录要长得多——我希望它会快得多

关于为什么运行如此缓慢(例如,表存储是否存在节流问题)有何想法?有没有更快、更可靠的方法?我开始认为最好的方法就是将每一行的分钟数为0或30的数据复制到另一个表中,这样我就可以在几个更大的查询中检索到我需要的内容。

如前所述:

针对表服务的查询一次最多可返回1000个实体,并且最多可执行5秒钟。如果结果集包含1000多个实体,如果查询未在5秒钟内完成,或者如果查询跨越分区边界,则响应包括自定义标头containing一组延续令牌。延续令牌可用于构造下一页数据的后续请求

根据您的场景,您指定了
partitionKey
rowKey
来检索单个记录。据我所知,此时,您的客户端将针对表服务发送1000多个请求,而对于或,它将只发送几个请求

我假设这可能是由于使用点查询(使用相等谓词指定单个PartitionKey和RowKey)时的网络延迟造成的。您可以通过以下方式检查表存储的
Average2Relationency
AverageServerLatency
指标:

有关表存储度量的更多详细信息,请参阅

有没有什么办法可以解释为什么运行速度如此之慢(例如,这是表存储的节流问题)?有没有更快、更可靠的方法?我开始认为最好的方法就是将分钟数为0或30的每一行复制到另一个表中,这样我就可以在几个更大的查询中检索到我需要的内容


根据我的理解,您可以通过在一个月范围内指定RowKey(例如,
RowKey>=“2016-06-01T00:00:00”和RowKey)来利用这些信息。非常感谢您提供的信息。但是,根据“在查询中同时指定分区和行键是从表服务检索单个实体的最快方法。”每个查询仅检索单个实体,因此我认为您在单个查询中关于1000+的评论不适用于此。我关心的是进行1000+个单独的查询,每个查询重新检索单个实体。我建议您可以尝试从表服务中诊断度量,并检查
平均2相关性
AverageServerLatency
用于解决此问题的指标。