# Why does MemoryConstrained have an upper limit on the constraint?

When evaluating MemoryConstrained for a large memory limit:

MemoryConstrained[Print["aaa"],10^10]


I get:

MemoryConstrained::ipnfm: Positive machine-sized integer or Infinity expected at position 2 in MemoryConstrained[Print[aaa],10^10]. >>


I have tested to find the limit, and is exactly 4294967295 bytes. Is there a reason for this? I need a larger memory limit.

I am using Mathematica 9.0.1 and 32-bit Windows 7.

-
I cannot reproduce this problem with the OS X version of Mathematica 8.0.4 or 9.0.1. (Both are 64-bit versions.) What OS are you using and what version of Mathematica? Also, is it a 32-bit or a 64-bit version? – Szabolcs Mar 12 '14 at 19:32
32-bit programs simply can't use more memory than this limit (more typically: half this limit). I also can't reproduce the problem with a 64-bit Mathematica 9 on Windows. – Szabolcs Mar 12 '14 at 19:35
I am using Mathematica 9.0.1 and 32-bit Windows 7. – Giovanni F. Mar 12 '14 at 19:45

This is not a specific limitation of Mathematica, but a limitation of 32-bit addressing and your 32-bit operating system. 64-bit versions of Mathematica do accept higher limits in MemoryConstrained.

What "32-bit" means is precisely that memory is indexed with integers stored on 32-bits, i.e. at most 2^32 = 4294967296 bytes can be addressed. A program running in 32-bit mode simply cannot use more than this much memory, i.e. 4 GB. In practice, the limit is more typically 2 GB.

Even if your computer has more than 4 GB of memory, if you use a 32-bit operating system, it can't take advantage of more than 4 GB (and in the case of Windows single programs will typically be able to use no more than 2 GB).

-
Ok, I tested the code on the computer I want to run the script and It worked. It is 64 bits. Thank you. – Giovanni F. Mar 12 '14 at 19:56
To run on both systems: MemoryLimit[]:=If[StringMatchQ[$System,"64-bit"],8*1024^3,1024^3]. 8 GB on the node and 1 GB on my computer. – Giovanni F. Mar 12 '14 at 20:15 @Giovanni $SystemWordLength tells you if this version of Mathematica is 32 or 64 bit. – Szabolcs Mar 12 '14 at 20:15
Hmm nice! I will use that instead. – Giovanni F. Mar 12 '14 at 20:17
When I posted the code above it left out the * from 64-bit. That will not work. Maybe you can just include that code (or the better version with \$SystemWordLength) as a sidenote in your answer for others who may need. :) – Giovanni F. Mar 12 '14 at 20:23