【问题标题】:Is local cache being used here? Why such slow IEnumerable evaluation?这里是否使用了本地缓存?为什么如此缓慢的 IEnumerable 评估?
【发布时间】:2011-08-14 02:38:48
【问题描述】:

在一个 EAV 模式中处理大约 4600 个对象,其中大约 140,000 个属性在序列化为单个集合时总共表示小于 25 MB;不确定序列化时到底有多大,因为它们在这里,作为 4600 个单独的缓存项。

为了解决 EAV 属性方案加载时间问题,我们尝试在启动时启动 AppFabric,并依靠本地缓存。但是,当评估来自 GetObjectsByTag 或 GetObjectsInRegion 的 IEnumerable 时,我观察到一些非常糟糕的性能:

   var products = new Dictionary<string, ProductContract>();

   Trace.WriteLine(DateTime.Now.ToLongTimeString() + " retrieving object collection from cache");
   //object productsObj = _cache.Get(ProductCollectionNameInCache, this.CacheRegion);
   //var productsObjUneval = _cache.GetObjectsByTag(ProductCacheTag, this.CacheRegion);
   var productsObjUneval = _cache.GetObjectsInRegion(this.CacheRegion);
   Trace.WriteLine(DateTime.Now.ToLongTimeString() + " retrieving object collection from cache complete");

   Trace.WriteLine(DateTime.Now.ToLongTimeString() + " evaluating IEnumerable object");
   var productsObj = productsObjUneval.Where(p=>p.Key != ProductsPrimedFlagNameInCache).ToList();
   Trace.WriteLine(DateTime.Now.ToLongTimeString() + " end evaluating IEnumerable object");

   Trace.WriteLine(DateTime.Now.ToLongTimeString() + " converting object collection to Dictionary<string, ProductContract>");
   products = productsObj.ToDictionary(p => p.Key, p => (ProductContract) p.Value);
   Trace.WriteLine(DateTime.Now.ToLongTimeString() + " end converting object collection to Dictionary<string, ProductContract>");

事件日志输出:

Level   Date and Time   Source  Event ID    Task Category
Information 4/27/2011 12:55:22 PM   EPC Service 0   None    12:55:22 PM end getting products from cache
Information 4/27/2011 12:55:22 PM   EPC Service 0   None    12:55:22 PM end converting object collection to Dictionary<string, ProductContract>
Information 4/27/2011 12:55:22 PM   EPC Service 0   None    12:55:22 PM converting object collection to Dictionary<string, ProductContract>
Information 4/27/2011 12:55:22 PM   EPC Service 0   None    12:55:22 PM end evaluating IEnumerable object
Information 4/27/2011 12:55:05 PM   EPC Service 0   None    12:55:05 PM evaluating IEnumerable object
Information 4/27/2011 12:55:05 PM   EPC Service 0   None    12:55:05 PM retrieving object collection from cache complete
Information 4/27/2011 12:55:05 PM   EPC Service 0   None    12:55:05 PM retrieving object collection from cache
Information 4/27/2011 12:55:05 PM   EPC Service 0   None    12:55:05 PM getting products from cache
Information 4/27/2011 12:55:05 PM   EPC Service 0   None    12:55:05 PM is cache primed? True

编辑:是否按标签调用所有对象或区域中的所有对象,总是违背分布式缓存而不是本地?那将是非常令人失望的,并且对我们的需求完全无用。 http://social.msdn.microsoft.com/forums/en-us/velocity/thread/C0F1863A-87D6-43BC-8EA5-667F072040D2

【问题讨论】:

    标签: c# caching ienumerable appfabric


    【解决方案1】:

    不确定,因为我不知道底层实现,但 .ToList() 对我来说似乎很可疑。这将遍历整个枚举。有必要吗?直接去 ToDictionary() 怎么样?

    【讨论】:

    • 顺便说一句,这可能只是将缓慢推迟到 ToDictionary() 调用。
    • 这是基本的 .NET .ToList 并且只是用于将 IEnumerable 评估与 ToDictionary 转换隔离以进行分析。 ToList 最初并不存在,是的,这种延迟最初是在调用 .ToDictionary 时出现的。
    • 你有没有通过分析器运行这个?听起来它只是在以下之一中处理缓慢: - 键或值访问器 - 枚举器 MoveNext() 调用
    • 谢谢,但这不是问题所在。当然,我在发帖之前进行了介绍。
    猜你喜欢
    • 1970-01-01
    • 2019-01-28
    • 2015-09-10
    • 2016-07-14
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多