2011-04-27 28 views
2

在某個EAV模式中使用一些〜4600個對象時,如果序列化爲單個集合,則總計代表小於25 MB的總計大約140,000個屬性;不能確定在序列化時究竟有多大,因爲它們在這裏是4600個單獨的緩存項目。這裏使用的是本地緩存嗎?爲什麼這麼慢IEnumerable評價?

要解決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

回答

0

不確定,因爲我不知道底層的實現,但.ToList()似乎對我很可疑。這將遍歷整個枚舉。有必要嗎?直接去ToDictionary()怎麼樣?

+0

順便說一下,這可能只是將延遲推遲到ToDictionary()調用。 – 2011-04-27 20:45:36

+0

這是基本的.NET .ToList,它只是爲了分析目的將IEnumerable評估與ToDictionary轉換隔離開來。 ToList最初並不存在,並且是的,延遲最初出現在.ToDictionary被調用時。 – andrewbadera 2011-04-27 20:51:21

+0

你有沒有通過探查器運行?這聽起來像它只是在緩慢的下列之一: - 鍵或值訪問器 - 枚舉器MoveNext()調用 – 2011-04-27 21:48:03