У меня есть приложение, в котором вся база данных реализована в памяти с использованием stl-map для каждой таблицы в базе данных.
Каждый элемент в карте stl является сложным объектом со ссылками на другие элементы в других картах stl.
Приложение работает с большим объемом данных, поэтому оно использует более 500 МБ ОЗУ. Клиенты могут связаться с приложением и получить отфильтрованную версию всей базы данных. Это делается путем прогона всей базы данных и поиска элементов, относящихся к клиенту.
Когда приложение работает в течение часа или около того, Windows 2003 SP2 начинает распаковывать части оперативной памяти для приложения (даже если на компьютере установлено 16 ГБ ОЗУ).
После того, как приложение было частично выгружено, вход клиента в систему занимает много времени (10 минут), поскольку теперь он генерирует ошибку страницы для каждого поиска указателя в stl-map. Если клиент снова выполняет вход в систему сразу после этого, он выполняется быстро (несколько секунд), поскольку вся память теперь снова находится в ОЗУ.
Я вижу, что Windows может заблокировать память в ОЗУ, но это обычно рекомендуется только для драйверов устройств и только для "небольших" объемов памяти.
Я полагаю, что плохим решением может быть перебрать всю базу данных памяти и, таким образом, сказать Windows, что мы все еще заинтересованы в хранении модели данных в ОЗУ.
Полагаю, еще одно плохое решение - полностью отключить файл подкачки в Windows.
Я полагаю, что дорогостоящим решением будет база данных SQL, а затем переписать все приложение, чтобы использовать слой базы данных. Тогда, надеюсь, в системе баз данных будут реализованы средства для быстрого доступа.
Существуют ли другие более элегантные решения?