Есть ли способ получить Размер виртуальной и физической памяти при работе под моно?Как получить доступный размер виртуальной и физической памяти в Mono?
ответ
Я не использовал много Моно, но вы пробовали просматривать журналы Mono Profiler? Я знаю, что они показывают физическую память, но я не уверен в виртуальном ...
Назовите меня любопытным, но зачем вам это нужно? Если у вас возникли проблемы с использованием памяти в вашем приложении, есть много different techniques, которые вы можете использовать, чтобы помочь уменьшить его ...
Редактировать: Оглядываясь, действительно нет единого способа собрать его ... тем не менее, в зависимости от того, как вы работаете приложения, вы можете получить доступ к текущему объекту процесса в C#
Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();
var physicalMemory = currentProcess.WorkingSet64;
var virtualMemory = currentProcess.PeakVirtualMemorySize64;
Тогда просто использовать/вернуться те, как вы считаете нужным.
источник: MSDN
QuantConnect.com запускает пользовательский код и отслеживает общее использование памяти, чтобы машина не выходила из ОЗУ. В настоящий момент мы закрываем его до фиксированного 1024 МБ, но хотим разрешить пользователю использовать полную RAM, доступную на машине, -> Мне нужно динамически знать оставшуюся RAM. – JaredBroad
Не mono (или C#, если на то пошло) уже отслеживает собственную память/использование ОЗУ? Может быть, я не совсем понимаю, что вы имеете в виду, когда говорите «user-code» ... –
Это для моей телеметрической системы ... сообщают о любых авариях приложения и связанных с ним системных данных. – user626528
Вы могли бы использовать эту реализацию "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);
}
Вопрос о _available_ количестве, а не итоговом. – user626528
@ user626528 Доступная память находится в конце ... Доступные страницы ... – Gooseman
Спасибо @Gooseman, немного шума в вашем ответе, который вводит в заблуждение. Я отредактировал, чтобы было проще показать, что вы отвечаете на вопрос OP. Это не идеальное решение (т. Е. Чтение из файловой системы), но по-прежнему действительный ответ. – JaredBroad
Вы нашли ответ? Год на и нет ответов ... – JaredBroad
Mono не является проектом типа «подожди год». Если у вас есть зуд, вы можете поцарапать его, они ждут вашего патча в [этот файл] (https://github.com/mono/mono-basic/blob/master/vbruntime/Microsoft.VisualBasic/Microsoft.VisualBasic .Devices/ComputerInfo.vb). –