Подтвердить что ты не робот

Экстремальные условия хранения данных: как насытить ОЗУ?

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

Я пробовал следующее, но 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();
    }
4b9b3361

Ответ 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 ГБ, чтобы они не сами ООМ). Вероятно, это не так хорошо для решения, как неуправляемый вызов для выделения памяти, но это было бы достаточно легко сделать.