Re: Query available max memory (RAM)?
- To: mathgroup at smc.vnet.net
- Subject: [mg114980] Re: Query available max memory (RAM)?
- From: István Zachar <zac at freemail.hu>
- Date: Sun, 26 Dec 2010 04:01:17 -0500 (EST)
- References: <ieklmr$4t4$1@smc.vnet.net> <if1o94$pak$1@smc.vnet.net>
Thank you Alexey for the code, it does what it says.
Now I wonder why there is no built-in function for this in Mathematica?
Nevertheless, I'll use this solution until a better comes up, if there
exists one.
Thanks again
Istvan
On Dec 24, 10:14 am, Alexey <lehi... at gmail.com> wrote:
> On 19 =D0=B4=D0=B5=D0=BA, 13:10, Istv=C3=A1n Zachar <z...=
@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