Re: Query available max memory (RAM)?
- To: mathgroup at smc.vnet.net
- Subject: [mg114968] Re: Query available max memory (RAM)?
- From: Alexey <lehin.p at gmail.com>
- Date: Fri, 24 Dec 2010 04:13:46 -0500 (EST)
- References: <ieklmr$4t4$1@smc.vnet.net>
On 19 =D0=B4=D0=B5=D0=BA, 13:10, Istv=C3=A1n Zachar <z... at freemail.hu> wrot=
e:
> Dear Group,
>
> is there a way to get data on the actual available max RAM in a
> Windows system? With SystemInformation and Environment I was unable to
> obtain this information.
>
> Istvan
You can use NETLink for this (it requires .NET version 2 or later to
be installed). You can get all memory-related information directly
from kernel32.dll (on 32-bit Windows systems). This is the fastest and
the most effective way.
For example, the following defines a function 'freePhysicalMemory'
that returns the current amount of free physical memory in bytes:
Needs["NETLink`"]
Module[{before(*,globalMemoryStatusEx,memorystatusex*)},
before = LoadedNETTypes[];
globalMemoryStatusEx = DefineDLLFunction[
"[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
public class MEMORYSTATUSEX
{public uint dwLength;
public uint dwMemoryLoad;
public ulong ullTotalPhys;
public ulong ullAvailPhys;
public ulong ullTotalPageFile;
public ulong ullAvailPageFile;
public ulong ullTotalVirtual;
public ulong ullAvailVirtual;
public ulong ullAvailExtendedVirtual;
public MEMORYSTATUSEX()
{this.dwLength = (uint)
Marshal.SizeOf(typeof( MEMORYSTATUSEX ));}}
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport(\"kernel32.dll\", CharSet=CharSet.Auto, \
SetLastError=true)]
public static extern bool GlobalMemoryStatusEx([In, Out] \
MEMORYSTATUSEX lpBuffer);"
];
memorystatusex = Complement[LoadedNETTypes[], before][[1, 1]];
memorystatusex = memorystatusex <> "+MEMORYSTATUSEX";
memorystatusex = NETNew[memorystatusex];
Block[{ullAvailPhys},
freePhysicalMemory :=
If[globalMemoryStatusEx[memorystatusex],
memorystatusex@ullAvailPhys, $Failed]]];
You can easily get all other memory-related information:
list = {{dwLength,
"The size of the structure, in bytes. You must set this member \
before calling GlobalMemoryStatusEx."}, {dwMemoryLoad,
"A number between 0 and 100 that specifies the approximate \
percentage of physical memory that is in use (0 indicates no memory \
use and 100 indicates full memory use)."}, {ullTotalPhys,
"The amount of actual physical memory, in bytes."}, {ullAvailPhys,
"The amount of physical memory currently available, in bytes. \
This is the amount of physical memory that can be immediately reused \
without having to write its contents to disk first. It is the sum of \
the size of the standby, free, and zero lists."}, {ullTotalPageFile,
"The current committed memory limit for the system or the current
\
process, whichever is smaller, in bytes. To get the system-wide \
committed memory limit, call GetPerformanceInfo."}, {ullAvailPageFile,
"The maximum amount of memory the current process can commit, in
\
bytes. This value is equal to or smaller than the system-wide \
available commit value. To calculate the system-wide available commit
\
value, call GetPerformanceInfo and subtract the value of CommitTotal \
from the value of CommitLimit."}, {ullTotalVirtual,
"The size of the user-mode portion of the virtual address space \
of the calling process, in bytes. This value depends on the type of \
process, the type of processor, and the configuration of the \
operating system. For example, this value is approximately 2 GB for \
most 32-bit processes on an x86 processor and approximately 3 GB for \
32-bit processes that are large address aware running on a system \
with 4-gigabyte tuning enabled."}, {ullAvailVirtual,
"The amount of unreserved and uncommitted memory currently in the
\
user-mode portion of the virtual address space of the calling \
process, in bytes."}, {ullAvailExtendedVirtual,
"Reserved. This value is always 0."}};
globalMemoryStatusEx[memorystatusex];
{Tooltip[#[[1]], Style[#[[2]], 22]] & /@ list,
memorystatusex /@ list[[All, 1]]} // Transpose // TableForm