Экстремальные условия хранения данных: как насытить ОЗУ?
Я хотел бы написать небольшую часть программы, которая запускает потоки, потребляет доступную оперативную память линейным образом до определенного уровня и останавливается (в идеале, паузы, пока "достаточная" память не будет освобождена и продолжит создавать потоки после этого, и т.д.)
Я пробовал следующее, но list.Add(new byte[])
требует непрерывного пространства RAM и исключает исключение OutOfMemoryException, которое НЕ является тем, что я пытаюсь имитировать.
РЕДАКТИРОВАТЬ:
У меня есть многопоточное приложение для голодания, которое питает целую кучу RAM GB. Все, что я хочу, - это изолировать/воспроизвести эту ситуацию в "Лабораторных условиях", чтобы решить ее, то есть написать адаптивный проект мониторинга мембран/нит-ограничителя. Я использую x64 OS для платформы x64.
Чтобы было ясно: результат, который я хочу увидеть, - это монитор памяти диспетчера задач, идущий прямо из-за программы.
static void Main(string[] args)
{
ComputerInfo ci = new ComputerInfo();
D("TOTAL PHYSICAL MEMORY : " + Math.Round(ci.TotalPhysicalMemory / Math.Pow(10,9),3) +" GB");
//########### Fill Memory ###############
var list = new List<byte[]>();
Thread FillMem= new Thread(delegate()
{
while (Process.GetCurrentProcess().PrivateMemorySize64 < MAX_MEM_LEVEL)
{
list.Add(new byte[1024 * 10000]); //<- I Need to change this
Thread.Sleep(100);
}
});
FillMem.Start();
//########### Show used Memory ###############
Thread MonitorMem = new Thread(delegate()
{
while (true)
{
D("PROCESS MEMORY : " + Math.Round(Process.GetCurrentProcess().PrivateMemorySize64 / Math.Pow(10, 6), 3) + " MB");
Thread.Sleep(1000);
}
});
MonitorMem.Start();
Console.Read();
}
Ответы
Ответ 1
Вопрос все еще довольно запутан; мне непонятно, что вы пытаетесь сделать здесь и почему.
Если вы действительно хотите потреблять физическую память, то есть сообщать операционной системе нет, на самом деле не использовать эту часть физического чипа RAM, установленную на компьютере, для чего-либо другого, кроме того, что я говорю, - тогда Я бы, вероятно, использовал неуправляемый код AllocateUserPhysicalPages из неуправляемого кода.
Затем это уменьшит объем физической памяти, доступный для других целей, заставляя больше страниц виртуальной памяти выходить в файл страницы.
Помимо того, что все программы, запущенные на вашем компьютере, намного медленнее, я не уверен, что вы намерены выполнить этим. Вы можете уточнить?
Ответ 2
Дело в том, что с C#
вы не можете вырастить более примерно 1.2 GB
ОЗУ на 32-разрядной платформе .NET. У вас может быть даже 8 ГБ ОЗУ на 64-битной машине, но если процесс, который вы запускали, был скомпилирован для 32-битной архитектуры, он приведет к OutOfMemoryException
, как только он достигнет 1,2 ГБ.
Для такого тестирования я бы предложил выбрать другой тип языков/фреймворков.
EDIT
Хорошая ссылка на тему:
is-there-a-memory-limit-for-a-single-net-process
Ответ 3
Если проблема, с которой вы столкнулись, заключается в том, что ваш процесс заканчивается из области виртуальной памяти, прежде чем аппаратное обеспечение закончит физическую память, тогда вы можете просто увеличить число (возможно,?) обработку с помощью вашего кода (и что-то, чтобы остановить их, скажем, на 1-2 ГБ, чтобы они не сами ООМ). Вероятно, это не так хорошо для решения, как неуправляемый вызов для выделения памяти, но это было бы достаточно легко сделать.