кеш больших объектов - PullRequest
       31

кеш больших объектов

1 голос
/ 09 марта 2009

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

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

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

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

Ответы [ 4 ]

5 голосов
/ 09 марта 2009

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

  • Абсолютное время : элементы вытесняются после того, как системные часы проходят определенный 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);
1 голос
/ 09 марта 2009

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

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

Cache.Add("myKey", MyLargeObject, null, DateTime.Now.AddMinutes(10), Cache.SlidingExpiration, CacheItemPriority.High)
0 голосов
/ 09 марта 2009

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

0 голосов
/ 09 марта 2009

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

...