2012-04-06 2 views
2

Есть ли способ установить максимальное использование памяти для 64-битного приложения?Прерывание выполнения алгоритма, когда требования к памяти превышают предопределенный предел?

Причина: когда 64-разрядный алгоритм/приложение на компьютере, работающем на моем ноутбуке, превышает требования к памяти 3 ГБ, мой компьютер становится очень медленным. (Остается медленным после того, как я вручную завершаю программу.) Я предпочел бы, чтобы алгоритм завершился, когда он превысил 3 ГБ.

ответ

4

Вы можете проверить недвижимость Process.WorkingSet64.

var currentProcess = System.Diagnostics.Process.GetCurrentProcess(); 
if(currentProcess.WorkingSet64 > 3221225472) 
    throw new System.OutOfMemoryException("Process memory consumption exceeded 3GB"); 

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

JobObjectWrapper - это .NET-абстракция над объектом работы Win32. С помощью в этой библиотеке вы можете создавать объекты задания, создавать и назначать процесс заданию, процессу управления и ограничениям работы и регистрировать для различные события уведомления о событиях, связанных с процессом и заданием.

Редактировать: от проекта образца:

class Program 
{ 
    static bool _isStop = false; 

    static void Main(string[] args) 
    { 
     try 
     { 
      using (JobObject jo = new JobObject("JobMemoryLimitExample")) 
      { 
       jo.Limits.JobMemoryLimit = new IntPtr(30000000); 
       jo.Events.OnJobMemoryLimit += new jobEventHandler<JobMemoryLimitEventArgs>(Events_OnJobMemoryLimit); 

       while (!_isStop) 
       { 
        ProcessStartInfo psi = new ProcessStartInfo("calc.exe"); 
        Process proc = jo.CreateProcessMayBreakAway(psi); 
        Thread.Sleep(100); 
       } 
      } 
     } 
     catch (Exception){ } 
    } 

    /// <summary> 
    /// The events which fires when a job reaches its memory limit 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="args"></param> 
    static void Events_OnJobMemoryLimit(object sender, JobMemoryLimitEventArgs args) 
    { 
     _isStop = true; 
     (sender as JobObject).TerminateAllProcesses(8); 
     Console.WriteLine("Job has reacehed its memory limit"); 
    } 
} 
+0

+1, даже если 'thow' не является ключевым словом. –

+0

Я бы предпочел прервать, не проверяя, как я называю внешние API, которые также выделяют память. Это возможно? – willem

+0

@willem: отредактировал мой ответ. –