8

For my programming exercise in C#, I am trying to create an array of long, with a length of 0x1fffffff (536,870,911 in base10), however I got System.OutOfMEmoryException.

For the build, I targeted x64 system, and I am running VisualStudio2008 on Windows7 x64 with 8GB of RAM. It should be enough memory for the array (it works on JDK x64 and CPP project)

Any thoughts ?

        const long MAX = 0x1fffffff; // 536870911 in base10
        program.arr = new long[MAX];
        for (long i = 0; i < MAX; i++)
        {
            program.arr[i] = i;                
        }
John Saunders
  • 160,644
  • 26
  • 247
  • 397
Lydon Ch
  • 8,637
  • 20
  • 79
  • 132
  • FYI, it's called "C#", not "CSharp". – John Saunders Apr 26 '11 at 14:34
  • 5
    You can't make an object that big. But even if you could, you seem to also be suffering from the misapprehension that RAM determines how much memory you can allocate. It does not, and has not for decades. Amount of RAM limits how *fast* you'll be able to access that memory. Having big RAM is a performance optimization; memory allocations are actually best thought of as allocations out of the page file. Remember, when you allocate memory you are allocating *virtual memory*, not *hardware memory*. – Eric Lippert Apr 26 '11 at 15:42

3 Answers3

29

The CLR doesn't support any single object of size greater than about 2GB. You're asking for an array of 4,294,967,288 bytes - over twice what's supported.

You can use that much memory, but not in a single object (such as an array).

Jon Skeet
  • 1,421,763
  • 867
  • 9,128
  • 9,194
5

It is hard to recommend any sort of meaningful alternative since you don't state what you're trying to achieve, just what you can't do.

That said if you really do need something which is a fast contiguous view into a flat address space bigger than 2GB in size you could use MemoryMappedFile.

It would help if you indicated what is meant to be going in this lump of memory, why the address space itself must be contiguous (are you passing a pointer to it to unmanaged code for example) and why it needs flat addressing.

ShuggyCoUk
  • 36,004
  • 6
  • 77
  • 101
0

Make a subset of Array then fill the array

yourary[]

masterarray[] <------ Fill youraray[] upto 2gb of buffer then add it in the masterarray