2009-03-09 2 views
1

У меня есть веб-приложение .NET2.0 C#. Он имеет переменное количество больших объектов, дорогостоящих по инициативе, которые совместно используются несколькими запросами, но не связаны с каким-либо конкретным пользователем. Поэтому я должен сохранять их в структуре поиска. Эти объекты должны быть созданы по мере необходимости и не требуются для срока службы приложения, а просто для их использования.большой кэш объектов

Плюс немного.

Проникающий в памяти способ сделать это - простой словарь, безопасный для памяти способ сделать это - словарь с поддержкой слабого слова, но проблема, с которой я сталкиваюсь, заключается в том, что GC просто слишком проклят. Реально это не может быть проблемой, потому что трафик на объекты должен быть таким, чтобы они оставались в живых, не будучи вынуждены слишком много регенерировать, но в идеале я бы хотел, чтобы они тоже уменьшались.

Есть ли какое-то решение среднего уровня, о котором я не думаю, что будет держать объекты безопасно скрытыми от GC на определенный промежуток времени X, но также позволяет им собираться в конце того времени, желательно, когда этот счетчик времени сбрасывается каждый раз, когда они используются таким же образом, как и токены сеанса?

ответ

5

Я не знаю, почему HttpRuntime cache не будет работать здесь товары, вставленные в кэш будет «обновлен» каждый раз, когда они сострадать , таким образом сохраняя их живыми до тех пор, пока они больше не понадобятся, и после этого они будут продолжать оставаться в кеше до тех пор, пока они не истекут (скользящее или скользящее время), или они вытесняются из-за давления в памяти. Их также можно вытеснить в явном виде -set, абсолютное время независимо от использования:

  • Абсолютного время: элементы вытеснены после системных часов проходит определенную DATETIME

  • скольжение (прокатка) Время: каждый раз, когда элемент прикосновения его отсчет время до смерти сбрасывается. Длительность обратного отсчета - это время скольжения (например, 5 минут). Использование

Пример:

//adds itemObject to cache under name "UniqueItemKey" 
//set to expire 5 minutes after last touched 
HttpRuntime.Cache.Add("UniqueItemKey", 
         itemObject, 
         null, 
         Cache.NoAbsoluteExpiration, 
         new TimeSpan(0, 5, 0), 
         CacheItemPriority.Normal, 
         null); 
+0

Точно то, что нужно OP, я верю. – configurator

+0

bang on - теперь у меня просто проблема подглядывания, не касаясь, но это для другого вопроса ... – annakata

1

Почему бы вам не использовать объект Cache из фреймворка и установить на нем скользящее истечение. Скажите 10 минут. Если он используется не реже одного раза в 10 минут, он останется в кеше, если истечет 10 минут, он истечет, и GC удалит его.

Пример:. (Я считаю, что это полный синтаксис

Cache.Add("myKey", MyLargeObject, null, DateTime.Now.AddMinutes(10), Cache.SlidingExpiration, CacheItemPriority.High) 
0

Это звучит, как вы уже описывающее решение вашей собственной проблемы; своего рода структуру кеша, которая содержит сильные ссылки в течение некоторого периода времени, но затем понижает их до слабых ссылок, если какое-то время проходит без доступа к объекту.

+0

понижение - это трюк, хотя ... – annakata

0

Ключевой частью является «срок их использования». Как вы это определяете? Если вы можете определить его точно таким образом, который не требует знания будущего, остальное, вероятно, легко.

Смежные вопросы