2013-06-28 2 views
6

Есть ли способ получить Размер виртуальной и физической памяти при работе под моно?Как получить доступный размер виртуальной и физической памяти в Mono?

+0

Вы нашли ответ? Год на и нет ответов ... – JaredBroad

+0

Mono не является проектом типа «подожди год». Если у вас есть зуд, вы можете поцарапать его, они ждут вашего патча в [этот файл] (https://github.com/mono/mono-basic/blob/master/vbruntime/Microsoft.VisualBasic/Microsoft.VisualBasic .Devices/ComputerInfo.vb). –

ответ

0

Я не использовал много Моно, но вы пробовали просматривать журналы Mono Profiler? Я знаю, что они показывают физическую память, но я не уверен в виртуальном ...

Назовите меня любопытным, но зачем вам это нужно? Если у вас возникли проблемы с использованием памяти в вашем приложении, есть много different techniques, которые вы можете использовать, чтобы помочь уменьшить его ...

Редактировать: Оглядываясь, действительно нет единого способа собрать его ... тем не менее, в зависимости от того, как вы работаете приложения, вы можете получить доступ к текущему объекту процесса в C#

Process currentProcess = System.Diagnostics.Process.GetCurrentProcess(); 
var physicalMemory = currentProcess.WorkingSet64; 
var virtualMemory = currentProcess.PeakVirtualMemorySize64; 

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

источник: MSDN

+0

QuantConnect.com запускает пользовательский код и отслеживает общее использование памяти, чтобы машина не выходила из ОЗУ. В настоящий момент мы закрываем его до фиксированного 1024 МБ, но хотим разрешить пользователю использовать полную RAM, доступную на машине, -> Мне нужно динамически знать оставшуюся RAM. – JaredBroad

+0

Не mono (или C#, если на то пошло) уже отслеживает собственную память/использование ОЗУ? Может быть, я не совсем понимаю, что вы имеете в виду, когда говорите «user-code» ... –

+0

Это для моей телеметрической системы ... сообщают о любых авариях приложения и связанных с ним системных данных. – user626528

2

Вы могли бы использовать эту реализацию "free" command (UNIX), чтобы выяснить, используемую и доступную физическую память (это лучший вариант ИМХО):

using System; 
using System.Text.RegularExpressions; 
using System.IO; 

namespace FreeCSharp 
{ 
    class MainClass 
    { 
     public static void Main(string[] args) 
     { 
      FreeCSharp free = new FreeCSharp(); 
      free.GetValues(); 

      long buffersPlusCached = free.Buffers + free.Cached; 
      long mainUsed = free.MemTotal - free.MemFree; 

      // What you would get from free command: 
      Console.WriteLine("-/+ buffers/cache: {0}  {1}", (mainUsed - buffersPlusCached), (free.MemFree + buffersPlusCached)); 

      // What means: 
      Console.WriteLine("Used physical memory: {0} kB", mainUsed - buffersPlusCached); 
      Console.WriteLine("Available physical memory: {0} kB", free.MemFree + buffersPlusCached); 
     } 
    } 

    /// <summary> 
    /// FreeCSharp: quick implementation of free command (kind of) using C# 
    /// </summary> 
    public class FreeCSharp 
    { 
     public long MemTotal { get; private set; } 
     public long MemFree { get; private set; } 
     public long Buffers { get; private set; } 
     public long Cached { get; private set; } 

     public void GetValues() 
     { 
      string[] memInfoLines = File.ReadAllLines(@"/proc/meminfo"); 

      MemInfoMatch[] memInfoMatches = 
      { 
       new MemInfoMatch(@"^Buffers:\s+(\d+)", value => Buffers = Convert.ToInt64(value)), 
       new MemInfoMatch(@"^Cached:\s+(\d+)", value => Cached = Convert.ToInt64(value)), 
       new MemInfoMatch(@"^MemFree:\s+(\d+)", value => MemFree = Convert.ToInt64(value)), 
       new MemInfoMatch(@"^MemTotal:\s+(\d+)", value => MemTotal = Convert.ToInt64(value)) 
      }; 

      foreach (string memInfoLine in memInfoLines) 
      { 
       foreach (MemInfoMatch memInfoMatch in memInfoMatches) 
       { 
        Match match = memInfoMatch.regex.Match(memInfoLine); 
        if (match.Groups[1].Success) 
        { 
         string value = match.Groups[1].Value; 
         memInfoMatch.updateValue(value); 
        } 
       } 
      } 
     } 

     public class MemInfoMatch 
     { 
      public Regex regex; 
      public Action<string> updateValue; 

      public MemInfoMatch(string pattern, Action<string> update) 
      { 
       this.regex = new Regex(pattern, RegexOptions.Compiled); 
       this.updateValue = update; 
      } 
     } 
    } 
} 

С другой стороны, это может используйте sysconf (UNIX), чтобы получить доступные в настоящее время страницы физической памяти. Это значение зависит от того, как много данных ОС имеют кэшированных, из-за этого, вы должны выполнить echo 3 > /proc/sys/vm/drop_caches перед запуском этого кода:

using System; 
using Mono.Unix.Native; 

OperatingSystem os = Environment.OSVersion; 
PlatformID pid = os.Platform; 
if (pid == PlatformID.Unix || pid == PlatformID.MacOSX) { 
    long pages = Syscall.sysconf (SysconfName._SC_AVPHYS_PAGES); 
    long page_size = Syscall.sysconf (SysconfName._SC_PAGESIZE); 
    Console.WriteLine("The number of currently available pages of physical memory: {0}, Size of a page in bytes: {1} bytes", pages, page_size); 
    Console.WriteLine("Mem: {0} bytes", pages * page_size); 
} 
+0

Вопрос о _available_ количестве, а не итоговом. – user626528

+0

@ user626528 Доступная память находится в конце ... Доступные страницы ... – Gooseman

+0

Спасибо @Gooseman, немного шума в вашем ответе, который вводит в заблуждение. Я отредактировал, чтобы было проще показать, что вы отвечаете на вопрос OP. Это не идеальное решение (т. Е. Чтение из файловой системы), но по-прежнему действительный ответ. – JaredBroad