Как избежать порчи жесткого диска - PullRequest
1 голос
/ 25 июня 2010

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

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

РЕДАКТИРОВАТЬ: Забыл упомянуть, моя программа использует несколько потоков.

Ответы [ 5 ]

3 голосов
/ 25 июня 2010

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

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

Аналогичный вопрос SO

Установить ограничение памяти процесса Windows (или пользователя)

3 голосов
/ 25 июня 2010

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

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

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

Смотрите здесь еще много подробностей этой проблемы: Как получить хорошую производительность одновременного чтения с диска

2 голосов
/ 25 июня 2010

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

1 голос
/ 25 июня 2010

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

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

0 голосов
/ 25 июня 2010

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

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

...