Используется ли здесь локальный кэш? Почему такая медленная вычисление с указанием IEnumerable?

#c# #caching #ienumerable #appfabric

#c# #кэширование #ienumerable #appfabric

Вопрос:

Работа с примерно ~ 4600 объектами в схеме EAV с общим количеством атрибутов около 140 000, что составляет менее 25 МБ при сериализации в виде единой коллекции; не уверен точно, насколько велик при сериализации, как здесь, в виде 4600 отдельных кэшированных элементов.

Чтобы обойти проблемы со временем загрузки схемы атрибутов EAV, мы пытаемся запустить AppFabric при запуске, а также использовать локальный кэш. Однако я наблюдаю очень низкую производительность при вычислении IEnumerable из GetObjectsByTag или GetObjectsInRegion:

    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

Ответ №1:

Не уверен, поскольку я не знаю базовую реализацию, но .ToList () кажется мне подозрительным. Это приведет к обходу всего перечисления. Это необходимо? Как насчет того, чтобы просто перейти непосредственно к ToDictionary()?

Комментарии:

1. Кстати, это, вероятно, просто отложит замедление до вызова ToDictionary().

2. Это базовый .NET . ToList и находится там только для того, чтобы изолировать вычисление IEnumerable от преобразования ToDictionary в целях профилирования. Изначально ToList там не было, и да, эта задержка была первоначально замечена, когда . Был вызван ToDictionary.

3. Вы запускали это через профилировщик? Похоже, что это просто связано с медлительностью в одном из следующих действий: — Средство доступа к ключу или значению — Вызов перечислителя MoveNext()

4. Спасибо, но проблема не в этом. И, конечно, я профилировал перед публикацией здесь.