azure色的服务面料可靠的字典linq查询非常慢
我在服务结构状态服务中有一个可靠的字典。 我有一个简单的linq表达式。
我正在使用Ix-Async包来构建一个asyncenumerable。
using (ITransaction tx = this.StateManager.CreateTransaction()) { var result = (await customers.CreateLinqAsyncEnumerable(tx)) .Where(x => x.Value.NameFirst != null && x.Value.NameFirst.EndsWith(n, StringComparison.InvariantCultureIgnoreCase)) .Select(y => y.Value); return await result.ToList(); }
数据分为2个分区,每个分区约有75,000条记录。 我使用Int64范围作为分区键。 在上面的代码中,“Result.ToList()”大约需要1分钟来执行每个分区。 另一个问题是,实际结果是空的! 在sql server中运行的相同sql返回客户名以“c”结尾的行。 但是,这是重点。 我最关心的是“ReliableDictionary”linq查询的性能。
问候
可靠字典定期从内存中删除最近最少使用的值。 这是启用
- 大型可靠词典
- 密度更高:每个副本的可靠集合密度更高,每个节点的副本密度更高。
权衡的是,这会增加读取延迟:磁盘IO需要检索未缓存在内存中的值。
有几种方法可以降低枚举的延迟。
1) 密钥过滤枚举 :您可以将要在查询中使用的字段移动到ReliableDictionary的TKey(上例中的NameFirst)。 这将允许您使用接收密钥filter的CreateEnumerbleAsync重载。 密钥filter允许Reliable Dictionary避免从磁盘中检索与您的查询不匹配的密钥的值。 这种方法的一个限制是TKey(因此其中的字段)无法更新。
2) 使用通知的内存中二级索引 : 可靠的字典通知可用于构建任意数量的二级索引。 您可以构建一个二级索引,将所有值保留在内存中,从而交换内存资源,以提供更低的读取延迟。 此外,由于您可以完全控制二级索引,因此可以保持二级索引的顺序(例如,在您的示例中,通过反向NameFirst)。
我们还在考虑使Reliable Dictionary的内存中TValue扫描策略可配置。 有了这个,您将能够配置可靠字典,以便在读取延迟优先于您时将所有值保留在内存中。
由于在您的方案中,枚举的大部分时间都花在磁盘IO上,因此您还可以使用自定义串行器 ,这可以减少磁盘和网络占用空间。
谢谢你的问题。
- Microsoft Service Fabric主机服务(FabricHostSvc)挂起启动
- 升级到SDK 2.3.301后,Service Fabric Actor或Service变为无法访问
- 服务结构unit testing和dependency injection
- 默认服务描述不能作为升级集EnableDefaultServicesUpgrade的一部分修改为true
- 在生产Azure Service Fabric群集中找不到libsodium-64.dll
- 如何使用tfs 2013与服务架构持续集成?
- 更新Service Fabric服务时,.Net Framework类库dll总是会更改
- 具有通用服务的服务结构
- Azure Service Fabric Actors – 未处理的exception?