2008-10-14 3 views
32

В настоящее время мы думаем о создании системы кэширования для хранения данных, извлеченных из базы данных SQL, и сделать их доступными для нескольких других приложений (веб-сайт, веб-сервис и т. Д.). , Мы полагаем, что кеш работает как служба Windows и в основном состоит из интеллектуального словаря, который содержит записи кэша. Мой вопрос в том, есть ли предел для рабочего набора приложения (он будет работать под Windows Server 2003)? Или количество физической памяти ограничено?Есть ли предел памяти для одного процесса .NET

+1

Рассмотрим вашу политику истечения срока действия кэша, прежде чем написать первую строчку кода. Это трудно испечь позже. Я предполагаю, что у вас есть все основания для этого. автономный доступ. Производительность не является достаточно хорошей причиной, вы можете сделать худшее из-за нехватки памяти на локальной машине. – 2008-10-14 08:23:55

+0

фактически, возможности - одна причина. второй заключается в том, что мы хотим централизовать кеш, чтобы сделать его доступным для различных приложений и автономных приложений. есть ли у вас опыт создания систем кэширования? можете ли вы рекомендовать дальнейшее чтение? – Mats 2008-10-14 08:38:13

+0

Система кеша ASP.NET может быть хорошим местом для получения некоторых идей или, может быть, блока кэширования приложений: http://msdn.microsoft.com/en-us/library/cc309502.aspx – 2008-10-14 08:53:58

ответ

39

32bit или 64bit? 32bit - 2gb (для процесса), 64 бит - 1TB (enterprise edition 2003 server).

However, the maximum size of a CLR Object is 2gb даже на 64-битной.

Обновление: информация была приведена в 2008 году. См. Ohad's answer для получения более подробной информации. Сервер Windows 2016 может иметь максимум 24TB.

+0

Спасибо за прочитанное. Кажется, что это сообщение было написано до выпуска .net 2.0. Интересно, были ли какие-либо изменения в более поздних версиях. – Mats 2008-10-14 08:36:45

0

Как и в случае с любой другой программой Windows, вы ограничены адресным пространством. То есть: на 32-битном, вы можете иметь 2 ГБ адресного пространства. На x64 вы можете иметь 8 ТБ.

Если у вас нет 8 ТБ физической памяти, он начнет страницу.

+1

И если вы не знаете, У меня есть 8 ТБ свободного места на жестком диске (я хочу), тогда вы начнете получать OutOfMemoryException. Очень жаль. Это будет некоторое время, прежде чем многие из нас будут иметь размеры жестких дисков в наших машинах разработки. :( – 2008-10-14 08:20:21

4

На 32-битной Windows, вы можете получить немного больше памяти, загружая Windows, с флагом/3GB и маркировки ваше приложение как «большой адрес осознает»

1

Matthias,

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

Мы реализовали это в предыдущем проекте, и это создало другие проблемы.

Для автономного доступа вы можете использовать sql express на рабочих столах, чтобы создать зеркало вашей базы данных (или просто бит, который вам нужно кэшировать)? Тогда все, что вам нужно сделать, это переключить базу данных, на которую указывает ваше приложение. Вы даже можете использовать его, чтобы хранить различия и воспроизводить их на сервере, хотя у этого есть другие проблемы. Вы можете изменить разрешения для локальной копии, чтобы сделать это доступным только для чтения, если это так.

Словари, которые вы собираетесь создать звук замечательно, как индексы Sql. Я бы опирался на sql, чтобы выполнить эту работу за вас, если вы можете ее создать. Зачем изобретать это колесо? Если вы это сделаете, вам нужно будет тщательно подумать об истечении срока действия кеша и управлении памятью, особенно если это служба Windows.

Успехов,

Сэм

20

Я недавно делал обширное профилирование вокруг границ памяти в .NET на процессе 32-битного. Мы все обманываем мыслью, что мы можем выделить до 2,4 ГБ (2^31) в .NET-приложении, но, к сожалению, это неверно :(Прикладной процесс имеет столько места для использования, и операционная система отлично справляется работа по управлению им для нас, однако сама .NET, похоже, имеет свои собственные накладные расходы, что составляет примерно 600-800 МБ для типичных приложений реального мира, которые вызывают ограничение памяти. Это означает, что как только вы выделите массив целых чисел, который принимает 1.4GB, вы должны ожидать увидеть OutOfMemoryException().

Очевидно, что в 64-битном листе это происходит позже (давайте поговорим через 5 лет :)), но общий размер всего в памяти также растет (я нахожу его от 1,7 до 2 раза) из-за увеличенного слова размер.

Я точно знаю, что идея виртуальной памяти от операционной системы определенно НЕ дает вам практически бесконечное пространство для размещения в рамках одного процесса. Он доступен только для того, чтобы полные 2,4 ГБ были адресованы всем (многим) приложениям, запущенным за один раз.

12

Следующая таблица от MSDN является наиболее точным ответом на ваш запрос. Обратите внимание, что флаг IMAGE_FILE_LARGE_ADDRESS_AWARE не может быть установлен непосредственно из управляемого компилятора, хотя, к счастью, его можно установить post build via the editbin utility. 4GT относится к флагом/3gb.

alt text

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