2013-10-25 6 views
3

Есть ли максимальное количество ключей/элементов, которые вы можете иметь в кэше .NET? Если да, то какой предел? Я не имею в виду максимальный размер кэша в MB..NET Cache: максимальное количество элементов

+4

ли вы имеете в виду 'System.Web.Caching.Cache' ? Если это так, это зависит от ['EffectivePercentagePhysicalMemoryLimit'] (http://msdn.microsoft.com/en-us/library/system.web.caching.cache.effectivepercentagephysicalmemorylimit.aspx) и' EffectivePrivateBytesLimit'. В противном случае это зависит от вашей памяти. Как и в каждой коллекции, вы можете добавлять элементы, пока не получите «OutOfMemoryException». –

+0

Существует «веб-кеш», существует «кэширование корпоративной библиотеки», которое теперь является частью «кеширования времени выполнения», есть «AppFabric Cache».Но серьезно, ни один из них не имеет ограничений по количеству предметов, только объем памяти может их отбросить. И некоторые из них могут фактически обнаруживать, когда у них заканчивается память и начинают выгружать себя. –

ответ

0

Не может быть точного предела в байтах, так как их реализация НЕ МОЖЕТ ЗНАТЬ, сколько байтов занимает объект (можно выяснить, но недоступно из коробки). Нет встроенной функции, такой как «sezeofobject (reference)», потому что невозможно сказать, где «объект заканчивается». Скажем, у вас есть объект, указывающий на 3 других объекта, если они будут считаться частью исходного объекта?

Во всяком случае, хотя косвенно можно определить, сколько единиц будет использовать кэширующее решение, невозможно сделать точно, например, можно просто использовать отражение для вычисления количества полей и использовать sizeof () примитивных типов и т. д., но опять же, это даст номер шара.

Как мы решили эту проблему - мы сериализовать объекты, которые мы держим в байт [] - это убивает много кроликов с одной пулей:

  • Возвращаемый объект из кэша является «невидимым» для GC и не поместить любое давление памяти на обходе графа
  • Мы можем точно знать, сколько байт объектного граф принимает
  • Возвращаемого объект из кэша 100% поточно-копия

Самая большая проблема - GC.

Кэшированные классы, поставляемые с .NET, удобны, но имеют серьезную проблему: они не могут хранить много данных (десятки миллионов +) объектов в течение длительного времени, не убивая ваш GC. Они отлично работают, если вы кэшируете несколько тысяч объектов, но в тот момент, когда вы переходите на миллионы и поддерживаете их до тех пор, пока они не будут распространяться в GEN2 - паузы GC в конечном итоге станут заметны, когда система достигнет порога низкой памяти, и GC необходимо подметать всех родов.

Практичность заключается в том, что если вам нужно хранить несколько сотен тысяч экземпляров, используйте кеш-память MS. Не имеет значения, являются ли ваши объекты 2-полевыми или 25 полями - это количество ссылок.

С другой стороны, есть случаи, когда необходимо использовать большие ОЗУ, которые являются общими в наши дни, то есть 64 ГБ. Для этого мы создали 100% управляемый менеджер памяти и кеш, который находится поверх него.

Наше решение может легко хранить 300 000 000 объектов в оперативной памяти без обхода GC вообще - это потому, что мы храним данные в больших (250 мб) байтах [] сегментах.

Вот код: NFX ворса (Apache 2,0) https://github.com/aumcode/nfx/blob/master/Source/NFX/ApplicationModel/Pile/ICache.cs

И видео: NFX ворса Cache - Youtube

https://www.youtube.com/watch?v=Dz_7hukyejQ

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