Я думаю, вы хотите что-то вроде этого:
SELECT @@servername as [HostName]
, @VID2 as [V-ID]
, @STIG AS [STIG]
, DatabaseName
, CASE
WHEN is_trustworthy_on = 0
THEN 'Completed'
ELSE 'Ongoing'
END AS Status
FROM #temp2
Как вы упомянули, принудительное хранение приложения в памяти - не лучший способ совместного использования ресурсов на компьютере. Быстрое решение, которое вам может пригодиться, - это просто запланировать событие, которое будит ваш сервис в определенное время каждое утро, прежде чем ваши клиенты начнут его использовать. Вы можете просто запланировать это в планировщике задач Windows с помощью простого сценария или вызова EXE.
Третий подход может состоять в том, чтобы ваша служба запускала поток, который делает что-то тривиальное, например, увеличивает счетчик, а затем спит довольно долго, например, 10 секунд. Тиос должен оказывать минимальное влияние на другие приложения, но по крайней мере некоторые из ваших страниц должны быть доступны.
С точки зрения Стоимость, самое дешевое и простое решение, вероятно, просто купить больше оперативной памяти для этого сервера, а затем вы можете полностью отключить файл подкачки. Если вы используете 32-битную Windows, просто купите 4 ГБ оперативной памяти. Тогда все адресное пространство будет обеспечено физической памятью, и файл подкачки ничего не будет делать.
Еще нужно убедиться, что ваши данные локализованы.
Другими словами: вам действительно нужны все 300 мегабайт памяти, прежде чем вы сможете что-либо сделать? Можно ли переупорядочить используемые вами структуры данных так, чтобы любой конкретный запрос мог быть удовлетворен всего несколькими мегабайтами?
Например
, если ваши 300 МБ кучи памяти содержат данные распознавания лиц.Можно ли организовать данные внутри так, чтобы данные о мужских и женских лицах хранились вместе? Или большие носы отделены от маленьких?
если он имеет какую-то логическую структуру, можно ли его отсортировать? чтобы можно было использовать двоичный поиск для пропуска большого количества страниц?
Если это собственный механизм базы данных в памяти, можно ли лучше проиндексировать / кластеризовать данные, чтобы не требовалось так много обращений к страницам памяти?
] если это текстуры изображения, могут ли обычно используемые текстуры располагаться рядом друг с другом?
Вам действительно нужны все 300 МБ памяти, прежде чем вы сможете что-либо сделать? Вы не можете обслуживать запрос без всех этих данных обратно в память?
В противном случае: запланированное задание на 6 ᴀᴍ, чтобы разбудить его.
Я не утверждаю, что вам нужно делать именно так, или что это лучшая практика, но вы можете обнаружить, что это работает достаточно хорошо для вас. Кажется, это соответствует тому, о чем вы просили.
Резюме: Касайтесь каждой страницы в процессе, по странице за раз, на регулярной основе.
Как насчет потока, который работает в фоновом режиме и просыпается раз в N секунд. Каждый раз, когда страница просыпается, она пытается прочитать с адреса X. Попытка защищена обработчиком исключений на случай, если вы прочитаете плохой адрес. Затем увеличиваем X на размер страницы.
В 4 ГБ 65536 страниц, в 3 ГБ - 49152 страницы, в 2 ГБ - 32768 страниц. Разделите время простоя (ночное мертвое время) на то, как часто вы хотите (пытаетесь) обращаться к каждой странице.
BYTE *ptr;
ptr = NULL;
while(TRUE)
{
__try
{
BYTE b;
b = *ptr;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
// ignore, some pages won't be accessible
}
ptr += sizeofVMPage;
Sleep(N * 1000);
}
Вы можете получить значение sizeOfVMPage из значения dwPageSize в возвращаемом результате GetSystemInfo().
Не пытайтесь обойти обработчик исключений, используя if (!IsBadReadPtr(ptr)), потому что другие потоки в приложении могут одновременно изменять защиту памяти. Если вы выйдете из строя из-за этого, определить причину будет практически невозможно (скорее всего, это будет неповторяющееся состояние гонки), поэтому не тратьте на это время.
Конечно, вы захотите отключить этот поток в течение дня и запускать его только в мертвое время.