Я пытаюсь воспроизвести ошибку, которая, кажется, появляется, когда пользователь израсходовал набор RAM. Что лучший способ состоит в том, чтобы или ограничить доступную RAM, которую компьютер может использовать или заполнить большую часть из него? Я предпочел бы делать это, физически не удаляя память и не выполняя набор произвольных, интенсивно использующих память программ (т.е., Photoshop, Quake, и т.д.).
Используйте виртуальную машину и установите для нее ограничения ресурсов, чтобы имитировать нужные вам условия.
VMWare - один из лидеров в этой области, и у них есть бесплатный проигрыватель VMware , который позволяет вам это делать.
Я копирую свой ответ из аналогичного вопроса:
Если вы тестируете собственное / неуправляемое / C ++ приложение, вы можно использовать AppVerifier и его настройку моделирования низкого ресурса, которая будет использовать внедрение ошибок для моделирования ошибок в распределении памяти (среди прочего). Это также действительно полезно для поиска множества других тонких проблем, которые часто приводят к сбоям приложения.
Вы также можете использовать consumer.exe, который является частью Microsoft Windows SDK для Windows 7 и .NET Framework 3.5 с пакетом обновления 1 , чтобы легко использовать много памяти, дискового пространства, времени процессора и т. Д. файл подкачки или пул ядра и посмотрите, как ваше приложение справляется с нехваткой доступных ресурсов. (Сбой? Как это сказывается на производительности? И т. Д.)
Создайте виртуальную машину и настройте оперативную память на то, что вам нужно.
Я использую Virtual Box от SUN.
Настроить легко.
«Мой первый вопрос: являются ли параллельные версии алгоритмов сортировки полезными в реальном мире» - зависит от размера набора данных, над которым вы работаете в реальной работе. Для небольших наборов данных ответ - нет. Для больших наборов данных это зависит не только от размера набора данных, но и от конкретной архитектуры системы.
Одним из ограничивающих факторов, который предотвратит ожидаемое повышение производительности, является компоновка кэш-памяти системы. Если данные могут поместиться в кэш L1 ядра, то сортировку по нескольким ядрам мало что можно получить, поскольку вы несете штраф за L1 промах кэша между каждой итерацией алгоритма сортировки.
То же самое относится к чипсам, которые имеют несколько кэшей L2 и архитектуры NUMA (неоднородный доступ к памяти). Таким образом, чем больше ядер нужно распределить сортировку, тем больше необходимо будет соответственно увеличить константу ToParallelize.
Другим ограничивающим фактором, который вы определили, является общий доступ к памяти или соперничество по шине памяти. Поскольку шина памяти может удовлетворять только определенному количеству обращений к памяти в секунду; наличие дополнительных ядер, которые по существу ничего не делают, кроме чтения и записи в основную память, создаст большую нагрузку на систему памяти.
Последний фактор, который я должен указать, это сам пул потоков, который может быть не так эффективен, как вы думаете. Поскольку у вас есть потоки, которые крадут и генерируют работу из общей очереди, эта очередь требует методов синхронизации; и в зависимости от того, как они реализованы, они могут вызывать очень длинные последовательные разделы в вашем коде.
-121--3505019-Это работает для меня:
set MAKE_COMMAND=mingw32-make -j% NUMBER _ OF _ PROCESSORS%
-121--4566245-При разработке на Java можно установить предельные значения памяти для JVM при запуске.