2010-06-25 2 views
1

Я разрабатываю большую программу, которая использует много памяти. Программа довольно экспериментальная, и я все время добавляю и удаляю большие куски кода. Иногда я добавляю рутину, которая довольно голодна, и накопитель на жестком диске начнет биться, а программа (и вся система) будет замедляться до скорости улиток. Это может легко занять 5 минут, чтобы закрыть его!Как избежать жесткого диска

Что бы я хотел, это механизм для предотвращения этого сценария. Либо процедура времени выполнения, либо даже что-то нужно сделать перед запуском программы, которая может сказать что-то вроде «Если вы запустите эту программу, существует риск взлома HDD - отмените сейчас, чтобы избежать замедления скорости улиток».

Любые идеи?

EDIT: Вспомните, моя программа использует несколько потоков.

+1

вы не можете трэш, что вы не имеете;) –

+0

Может быть, вы должны пролить свет на то, почему ваша программа настолько большой объем памяти. Что делает ваша программа? Возможно, что то, что вы разрабатываете, требует больше оперативной памяти, чем то, что может предоставить ваша текущая система на базе Windows XP (я предполагаю, что у вас 1 ГБ, вершины). Возможно, вы также не разработали свою программу для правильной работы с памятью. Загружайте вещи, когда они вам нужны, и выгружайте их, когда они вам не нужны, чтобы ваша программа работала по скудному профилю, если вам не нужны вещи, предварительно загруженные по соображениям производительности. – RavB

ответ

3

Вы можете использовать SetProcessWorkingSetSize. Это было бы полезно при отладке, потому что ваше приложение выйдет из строя с фатальным исключением, когда у него закончится нехватка памяти, а не перетаскивание вашего компьютера в ситуацию перебора.

http://msdn.microsoft.com/en-us/library/ms686234%28VS.85%29.aspx

Похожие SO вопрос

Set Windows process (or user) memory limit

-1

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

Говорить ему каждый раз, когда он начинает программу, бессмысленно.

+0

Это не готовый продукт. Я его развиваю. Мне нужно это предупреждение для моего использования на моей машине. – Mick

+0

@ Мик: в этом случае, если вы тестируете особенно голодный кусок кода, проверьте его на другом поле, чтобы вы не испортили свой бокс. – Randolpho

+0

Виртуальные машины и ограничения рабочего процесса, оба очень полезны, на одной коробке. –

3

Windows XP ужасен, когда есть несколько потоков или процессов, обращающихся к диску в одно и то же время. Это эффективно то, что вы испытываете, когда ваше приложение начинает меняться, поскольку ОС записывает некоторые страницы во время чтения в других. Windows XP (и Server 2003, если на то пошло), для этого абсолютно бесполезен. Это настоящий позор, так как это означает, что обмен данными почти синонимичен с использованием этих систем.

Ваши варианты:

  • Microsoft исправила эту проблему в Vista и Server 2008. Таким образом, отказаться от использования старой ОС на 9 лет. :)
  • Используйте небуферизованный ввод-вывод для чтения/записи данных в файл и реализации собственного пейджинга внутри вашего приложения. Реализация вашего собственного «свопа», как это, позволяет вам избежать обмолота.

Смотрите здесь много больше деталей этой проблемы: How to obtain good concurrent read performance from disk

2

Я не знаком с программированием Windows, но под Unix вы можете ограничить объем памяти, программа может использовать с setrlimit(). Может быть, есть что-то подобное. Цель состоит в том, чтобы заставить программу прервать работу, когда она использует много памяти, а не измельчение. Предел будет немного меньше, чем общая физическая память на машине. Я бы предположил где-то между 75% и 90%, но некоторые эксперименты были бы необходимы, чтобы найти оптимальную настройку.

+0

, что было бы отличным решением, если бы был эквивалент Windows ... – Mick

+0

есть способ (я решил включить его в качестве ответа). –

1

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

Ваша программа будет работать намного быстрее. Если вы используете столько памяти, то в основном все ваши встроенные кеши первого и второго уровней, вероятно, переполняются, а это означает, что процессор в основном ожидает загрузки памяти вместо обработки инструкций вашего кода.

+0

Программа действительно должна содержать значительное количество памяти на кристалле. Он управляет большой древовидной структурой и непредсказуемо скачет вокруг него. – Mick

+0

Возможно, вы захотите сохранить обработку на диске и использовать b-деревья. Выполнение таких программ только в любом случае поместит память на диск, а b-деревья специально оптимизированы для использования тех характеристик производительности, которые предлагают вращающиеся диски. Установите размер вашего узла в соответствии с размером блока диска, и вам понадобятся только блокировки памяти в любой момент времени. Добавьте кеш типа LRU, и вы можете довести это количество блоков до ~ 100 и пропустить много дисков. –

Смежные вопросы