我试图将2000万行加载到分区有状态服务ReliableDictionary中。我将有状态服务划分为10个分区。基于MSDN文档,我理解我需要使用一些散列算法来找到正确的分区并将数据发送到它以加载到IReliabledictionary中。所以我使用Hydra根据值获取分区号。我存储的所有内容都是List<long>
中的IReliableDictionary
。
所以我创建了一个无状态服务作为包装器,
fabric message too large
异常,所以我将每个请求分成100000个。 这需要74分钟才能完成。这太长了。以下是上传代码 -
请告知。
foreach (var itemKvp in ItemsDictionary)
{
var ulnv2Uri = new Uri("fabric:/TestApp/dataservice");
//Insert to the correct shard based on the hash algorithm
var dataService = _serviceProxyFactory.CreateServiceProxy<IDataService>(
dataStoreUri,
new ServicePartitionKey(itemKvp.Key), TargetReplicaSelector.PrimaryReplica, "dataServiceRemotingListener");
var itemsShard = itemKvp.Value;
//if the total records count is greater then 100000 then send it in chunks
if (itemsShard.Count > 1_000_000)
{
//var tasks = new List<Task>();
var totalCount = itemsShard.Count;
var pageSize = 100000;
var page = 1;
var skip = 0;
while (skip < totalCount)
{
await dataService.InsertData(itemsShard.Skip(skip).Take(pageSize).ToList());
page++;
skip = pageSize * (page - 1);
}
}
else
{
//otherwise send all together
await dataService.InsertData(itemsShard);
}
}
答案 0 :(得分:1)
通过并行上传到所有分区,您可以节省一些时间。 因此,创建10个服务代理(每个分区一个)并同时使用它们。